A
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<2*a+100 - b<<endl;
return 0;
}B 题意:就是找到一个数能被尽可能多的a[]数组里面的数整除。找到这个数输出就行了。 因为只有1000,我们直接暴力即可。
#include<bits/stdc++.h>
#define maxn 1004
#define inf 0x3f3f3f3f
using namespace std;
int a[maxn];
int num[1004]={0};
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=2;i<=1000;i++){
for(int j=1;j<=n;j++){
if(a[j] % i == 0){
num[i]++;
}
}
}
int res = INT_MIN;
int ans;
for(int i=2;i<=1000;i++){
if(num[i] > res){
res = num[i];
ans = i;
}
}
cout<<ans<<endl;
return 0;
} C 题意:就是让我们尽可能少的删除一些数,然后使得删除后的这个整数能 乘除 3 就行了。
思路:这个有一个数学定理:一个数的(各个数位上的数字)的和能被3整除,这个数就能被3整除。 所有我们可以直接用二进制枚举,然后每次得到一个数更新最少删除次数就行了。
这里我又查了查其他的数有没有这样子的性质:
①能被2或5整除的数的特征是;这个数的末一位数能被2或5整除。 ②能被3或9整除的数的特征是;这个数的各位数字之和能被3或9整除。 ③能被7、11、13整除的数的特征是;这个数的末三位数字所表示的数与末三位以前的数字所表示的数的差(或反过来)能被7、11、13整除。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>ve;
int main(){
ll num;
cin>>num;
while(num){
int rem=num%10;
ve.push_back(rem);
num/=10;
}
int n=ve.size();
bool flag=false;
int ans=n;
for(int i=1; i<(1<<n); i++){
ll sum=0;
int cnt=0;
for(int j=0; j<n; j++){
if(i&(1<<j)){
sum+=ve[j];
}
else
cnt++;
}
if(sum%3==0){
flag=true;
ans=min(ans,cnt);
}
}
if(flag) cout<<ans<<endl;
else cout<<"-1"<<endl;;
return 0;
}D 题意:就是跟一个小游戏一样,他每次走a[]数组的一个数,两个数,三个数,… ,n个数,每次正值表示向右,负值表示向左,问能到达的最远距离。
思路:O(n^n)的思路大家肯定都会,就是每次记录能到达的最远距离,外层枚举当前能走到哪个a[i],内层从a[0] -->到当前a[i]模拟其来回走,最后输出就行。
但其实我们细想。我们可以用一个O(n)的方法,我们就是记录单次当前能走到的距离s,然后我们每走一次要保存最远能到达的距离,然后我们这个时候要记录整体p,就是累加s的距离。然后我们还得更新每次走完能到达的最远距离,这个才是真正的能走到的最远距离。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll n;
cin>>n;
ll maxs=0,a,s=0,p=0,ans=0;
for (ll i = 0; i < n; i++) {
cin>>a;
s+=a;//相当于到该位置的一个总和
maxs=max(maxs,s);//保存能到达的最远距离
ans=max(ans,maxs+p);
p+=s;
}
cout<<ans<<endl;
return 0;
}E.
题意:就是一个矩阵,有灯有墙,墙会挡住灯的光,光能在没有墙的情况下无限向上下左右四个方向照射。问整个矩阵能照亮的方格为多少?
思路:很简单的一个题,就是往上下左右四个方向扩展嘛,遇见墙了就停止。
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
typedef long long ll;
int H,W,N,M;
char S[1500][1500];
int fx[]={1,0,-1,0};
int fy[]={0,1,0,-1};
int main(){
cin>>H>>W>>N>>M;
rep(i,H) rep(j,W) S[i][j]='.';
int a,b;
rep(i,N){
cin>>a>>b;
S[a-1][b-1]='o';//代表灯光
}
rep(i,M){
cin>>a>>b;
S[a-1][b-1]='#';//代表墙壁
}
ll ans=0;
rep(i,H){
rep(j,W){
if(S[i][j]=='o'){
rep(k,4){
int x=i;
int y=j;
while(0<=x+fx[k] && x+fx[k]<H && 0<=y+fy[k] && y+fy[k]<W && S[x+fx[k]][y+fy[k]]!='#' && S[x+fx[k]][y+fy[k]]!='o'){
x+=fx[k];
y+=fy[k];
S[x][y]='w';
}
}
}
}
}
rep(i,H) rep(j,W) if(S[i][j]=='o' || S[i][j]=='w') ans++;
cout<<ans<<endl;
return 0;
}F 没看,待补