A.数字统计

思路

暴力招数!

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("tj.in","r",stdin);
	freopen("tj.out","w",stdout);
	int l,r;
	cin>>l>>r;
	long long sum=0;
	for(int i=l;i<=r;i++){
		int u=i;
		while(u!=0){
			if(u%10==2){
				sum++;
			}
			u/=10;
		}
	}
	cout<<sum;
	return 0;
}

B.乒乓球🏓

思路

模拟

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("pingpong.in","r",stdin);
	freopen("pingpong.out","w",stdout);
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	string a;
	while(1){
		char op;
		cin>>op;
		if(op=='E'){
			break;
		}
		a=a+op;
	}
	int hua=0,dui=0;
	a=' '+a;
	for(int i=1;i<a.size();i++){
		if(a[i]=='W'){
			hua++;
		}else{
			dui++;
		}
		if((hua>=11&&hua-dui>=2)||(dui>=11&&dui-hua>=2)){
			cout<<hua<<":"<<dui<<endl;
			dui=0;
			hua=0;
		}
	}
	cout<<hua<<":"<<dui<<endl;
	cout<<endl;
	hua=0;
	dui=0;
	for(int i=1;i<a.size();i++){
		if(a[i]=='W'){
			hua++;
		}else{
			dui++;
		}
		if((hua>=21&&hua-dui>=2)||(dui>=21&&dui-hua>=2)){
			cout<<hua<<":"<<dui<<endl;
			hua=0;
			dui=0;
		}
	}
	cout<<hua<<":"<<dui<<endl;
	return 0;
}

反思

不知道乒乓球的规则,所以就连题目都理解错了。

C. 侦探推理

思路

大大大模拟!!

具体思路

  1. 将所有的数据输入,并且判断是哪种类型
  2. 枚举谁是罪犯,并且枚举日期。
  3. 写一个函数,用来判断说谎的人数。
  4. 如果说谎的人数小于nn并且说谎的人数加上说废话的人数n≥n,就是嫌疑犯。
  5. 提示:说谎的人数与废话的人数是按人头记

代码

#include<bits/stdc++.h>
using namespace std;
int m,n,p;
string name[30];
struct P{
	string name;
	string say;
	int ip;
};
P a[30];
int k=0;
unordered_map<string,bool> mp,dr;
string week[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int steep(string names,string day){
	int s=0;
	mp=dr;
	for(int j=1;j<=p;j++){
		int as=a[j].ip;
		if(as==0) continue;
		if(as==1){
			if(a[j].name!=names){
				if(mp[a[j].name]!=1){
					s++;
					mp[a[j].name]=1;
				}
			}else{
				if(mp[a[j].name]==1) return -0x3f3f3f3f;
			}
		}if(as==2){
			if(a[j].name==names){
				if(mp[a[j].name]!=1){
					s++;
					mp[a[j].name]=1; 
				}
			}else{
				if(mp[a[j].name]==1) return -0x3f3f3f3f;
			}
		}if(as==3){
			if(a[j].say!=names){
				if(mp[a[j].name]!=1){
					s++;
					mp[a[j].name]=1;
				}
			}else{
				if(mp[a[j].name]==1) return -0x3f3f3f3f;
			}
		}if(as==4){
			if(a[j].say==names){
				if(mp[a[j].name]!=1){
					s++;
					mp[a[j].name]=1;
				}
			}else{
				if(mp[a[j].name]==1) return -0x3f3f3f3f;
			}
		}if(as==5){
			if(day!=a[j].say){
				if(mp[a[j].name]!=1){
					s++;
					mp[a[j].name]=1;
				}
			}else{
				if(mp[a[j].name]==1) return -0x3f3f3f3f;
			}
		}
	}
	return s;
}
void intt(string say,int i){
	a[i].say=say;
	if(say=="I am guilty."){
		a[i].ip=1;
		return ;
	}
	if(say=="I am not guilty."){
		a[i].ip=2;
		return ;
	}
	for(int j=1;j<=m;j++){
		string as=name[j]+" is guilty.";
		if(say==as){
			a[i].ip=3;
			a[i].say=name[j];
			return;
		}
	}
	for(int j=1;j<=m;j++){
		string as=name[j]+" is not guilty.";
		if(say==as){
			a[i].ip=4;
			a[i].say=name[j];
			return;
		}
	}
	for(int j=0;j<7;j++){
		string as="Today is "+week[j]+'.';
		if(say==as){
			a[i].ip=5;
			a[i].say=week[j];
			return ;
		}
	}
	a[i].ip=0;
	if(dr[a[i].name]==0){
		k++;
		dr[a[i].name]=1;
	}
	return ;
}
int main(){
	freopen("zt.in","r",stdin);
	freopen("zt.out","w",stdout);
	cin>>m>>n>>p;
	for(int i=1;i<=m;i++){
		cin>>name[i];
	}
	for(int i=1;i<=p;i++){
		string as;
		cin>>as;
		as.pop_back();
		a[i].name=as;
		getchar();
		string u;
		getline(cin,u);
		intt(u,i);
	}
	int ans_1=0;
	string ans_2;
	for(int i=1;i<=m;i++){
		for(int ik=0;ik<7;ik++){
			int us=steep(name[i],week[ik]);
			if(us!=-0x3f3f3f3f){
				if(us<=n&&us+k>=n){
					ans_2=name[i];
					ans_1++;
					break;
				}
			}
		}
		if(ans_1>1){
			cout<<"Cannot Determine";
			return 0;
		}
	}
	if(ans_1>1){
		cout<<"Cannot Determine";
		return 0;
	}
	if(ans_1<1){
		cout<<"Impossible";
		return 0;
	}
	cout<<ans_2;
	return 0;
}

反思

我在看这道题时以为是模拟人脑吓了一大跳!所以没做。

以后应当思考暴力会不会超时再思考。

同时,我在复现赛的时候做错了好多次,总结如下:

  1. 第一种:不是按人头计数。
  2. 没有判断不成立情况。
  3. 当是没有用函数,导致做题不好检查。第二次好多了!

D. 游戏

思路

区间DP裸题

将环变成链,就是道区间裸题

代码

#include<bits/stdc++.h>
using namespace std;
int a[120],as[120];
int f[120][120][20],g[120][120][20];
int main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i];
	}
	for(int i=1;i<=n*2;i++){
		as[i]=as[i-1]+a[i];//前缀和
	}
	memset(g,0x3f3f3f3f,sizeof g);
	for(int len=1;len<=n;len++){
		for(int l=1;l<=n;l++){
			int r=l+len-1;
			f[l][r][1]=g[l][r][1]=(((as[r]-as[l-1])%10)+10)%10;
			for(int i=2;i<=m;i++){//枚举分段
				for(int j=l+1;j<=r;j++){//枚举分段位置
					f[l][r][i]=max(f[l][r][i],f[l][j-1][i-1]*((((as[r]-as[j-1])%10)+10)%10));
					g[l][r][i]=min(g[l][r][i],g[l][j-1][i-1]*((((as[r]-as[j-1])%10)+10)%10));
				}
			}
		}
	}
	int ans_max=0,ans_min=0x3f3f3f3f;
	for(int i=1;i<=n+1;i++){
		ans_max=max(f[i][i+n-1][m],ans_max);
	}for(int i=1;i<=n+1;i++){
		ans_min=max(min(g[i][i+n-1][m],ans_min),0);
	}
	cout<<ans_min<<endl<<ans_max;
	return 0;
}

反思

考试时:

对于区间DP的理解不深刻,没做。

复现赛:

我当时想当然地将n2n*2,可却忘了这是破环成链。所以应当将结果求最大值(长度为n)