T1T1

考试错误:一遍ACAC的,没发生错误。

思路:

11.先定义一个i。

22.然后循环直到2i2^i-11>nn

33.最后输出2i2^i-11

代码:

#include <bits/stdc++.h>
#define int long long 
using namespace std;
signed main(){
	freopen("aoteman.in","r",stdin);
	freopen("aoteman.out","w",stdout);
    int n;
    cin >> n;
    int x=1;
    for(int i=1;x<=n;i++){
        x=(1<<i)-1;
    }
    cout << x;
}

T2T2

考试错误:暴力骗4040分,没发生错误。

思路:

11.首先对每一行求出差分数组(可省略,无影响)。

22.用一维差分求出每行轰炸范围,并用差分将范围里的数+11

33.最后求前缀和并&11,求出一的个数。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+50;
int f[N][N];
int x,y,r;
signed main(){
	freopen("boom.in","r",stdin);
	freopen("boom.out","w",stdout);
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=m;i++){
        cin >> x >> y >> r;
        for(int i=1;i<=n;i++){
            int k=r-abs(i-x);
            if(k<0) continue;
            int _1=1;
            int l=max(y-k,_1),r=min(y+k,n);
            f[i][l]++;
            f[i][r+1]--;
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            f[i][j]+=f[i][j-1];
            cnt+=f[i][j]%2;
        }
    }
    cout << cnt;
}

T3T3

考试错误:这一题不会,没有做出来。

思路:

一道大模拟,需要用两个数组ll,rr表示1~ii~n之间最多有多少个钻石放在一起。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int a[N],l[N],r[N];
signed main(){
    freopen("demon.in","r",stdin);
	freopen("demon.out","w",stdout);
    int n,k;
    cin >> n >> k;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    sort(a+1,a+n+1);
    for(int i=1,j=1;i<=n;i++){
		while(j<=i&&a[i]-a[j]>k){
			j++;
		}
		l[i]=i-j+1;
	}
	for(int i=1;i<=n;i++){
		l[i]=max(l[i-1],l[i]);
	}
	for(int i=n,j=n;i>0;i--){
		while(j>=i&&a[j]-a[i]>k&&j>0){
			j--;
		}
		r[i]=j-i+1;
	}
	int mx=0;
	for(int i=n;i>0;i--){
		r[i]=max(r[i+1],r[i]);
	}
	for(int i=1;i<=n;i++){
		mx=max(l[i]+r[i+1],mx);
	}
	cout << mx;
}

T5T5

考试错误:一遍ACAC的,无。

思路:

纯模拟,算法都没考,思路按题目要求来,过于简单,此处略。

代码:

#include <bits/stdc++.h>
using namespace std;
int a[15][15];//地图
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int main(){
	freopen("cow.in","r",stdin);
	freopen("cow.out","w",stdout);
    int ti,tj,ci,cj;//小田与牛的坐标
    for(int i=1;i<=10;i++){
        for(int j=1;j<=10;j++){
            char c;
            cin >> c;
            if(c=='*') a[i][j]=1;
            else a[i][j]=0;
            if(c=='T') ti=i,tj=j;
            if(c=='C') ci=i,cj=j;
        }
    }
    int tf=0,cf=0,cnt=0;//方向、计数
    while(ti!=ci||tj!=cj){
        int nti=ti+dx[tf],ntj=tj+dy[tf];//小田位置
        int nci=ci+dx[cf],ncj=cj+dy[cf];//牛位置
        bool ft=0,fc=0;
        if(nti<1||ntj<1||nti>10||ntj>10){
            tf++;
            if(tf==4) tf=0;
            ft=1;
        }if(nci<1||ncj<1||nci>10||ncj>10){
            cf++;
            if(cf==4) cf=0;
            fc=1;
        }if(a[nti][ntj]==1){
            tf++;
            if(tf==4) tf=0;
            ft=1;
        }if(a[nci][ncj]==1){
            cf++;
            if(cf==4) cf=0;
            fc=1;
        }if(ft==0||fc==0){
            if(ft==0){
                ti=nti,tj=ntj;
            }if(fc==0){
                ci=nci,cj=ncj;
            }
        }
        cnt++;
        if(cnt==1e7){ //次数过多,直接return 0;
        	cout << 0;
        	return 0;
		}
    }
    cout << cnt;
}