A. 数字统计

题目类型:数位分离

思路

从l到r一个个数位分离看二的个数即可。

代码

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

本题代码已AC,下一次继续保持。

B. 乒乓球

题目类型:字符串

思路

直接模拟即可,只不过要注意几个特例:

  • 若只有E,就需要输出cout<<0<<":"<<0<<endl<<endl<<0<<":"<<0;。
  • 若还有剩余,就需要输出
  • 若正好比完一局,就还需要输出cout<<0<<":"。<<0<<endl<<endl<<0<<":"<<0;。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("pingpong.in","r",stdin);
	freopen("pingpong.out","w",stdout);
	char a;
	bool b=0;
	string s;
	while(cin>>a&&a!='E'){
		s+=a;
		b=1;
	}
	if(!b){
		cout<<0<<":"<<0<<endl<<endl<<0<<":"<<0<<endl;
		return 0;
	}
	int cnt_0=0,cnt_1=0;
	for(int i=0;i<s.size();i++){
		if(s[i]=='W') cnt_0++;
		if(s[i]=='L') cnt_1++;
		if((cnt_0>=11||cnt_1>=11)&&abs(cnt_0-cnt_1)>=2){
			cout<<cnt_0<<":"<<cnt_1<<endl;
			cnt_0=0,cnt_1=0;
		}
	}
	cout<<cnt_0<<":"<<cnt_1<<endl;
	cnt_0=0,cnt_1=0;
	cout<<endl;
	for(int i=0;i<s.size();i++){
		if(s[i]=='W') cnt_0++;
		if(s[i]=='L') cnt_1++;
		if((cnt_0>=21||cnt_1>=21)&&abs(cnt_0-cnt_1)>=2){
			cout<<cnt_0<<":"<<cnt_1<<endl;
			cnt_0=0,cnt_1=0;
		}
	}
	cout<<cnt_0<<":"<<cnt_1<<endl;
	return 0;
}

没理解“如果一局比赛刚开始,则此时比分为0比0。直到分差大于或者等于2,才一局结束。“这两句话,所以没交,下次一定要交一下试试看。

C. 侦探推理

题目类型:模拟

思路

本题是一个大模拟,所以代码也比较繁琐,但是思路还是比较简单的。我们可以在枚举每个同学是凶手的过程中,依次枚举今天是星期几,然后判断说谎的同学是否有n个。

那么最终结果就有三种:

凶手正好有一个,输出凶手名字。

凶手大于一个,输出"Cannot Determine"。

没有一个凶手,输出"Impossible"。

然而,每个同学说的话的真实性需要始终如一,如果出现某个同学既说真话又说假话,那么当前枚举的情况就是不合法的。每个句子也只有三种情况:真话、假话、废话。最终,如果假话数量 ≤n≤ 假话数量+废话数量,那么说谎的同学就有n个。

代码

#include<bits/stdc++.h>
using namespace std;
string name[110];
int a[110],b=0,c=0,n,m,p,cnt;
bool st[110];
pair<int,string> z[110];
string xq[]={
	"Today is Monday.",
	"Today is Tuesday.",
	"Today is Wednesday.",
	"Today is Thursday.",
	"Today is friday.",
	"Today is Saturday.",
	"Today is Sunday."
};
int get_id(string s){
	for(int i=1;i<=m;i++) if(name[i]==s) return i;
	return -1;
}
int hy(int day,int ss,int sm,string s){
	if(s=="I am guilty.") return sm!=ss;
	if(s=="I am not guilty.") return sm==ss;
	for(int i=1;i<=m;i++) if(name[i]+" is guilty."==s) return i!=ss;
	for(int i=1;i<=m;i++) if(name[i]+" is not guilty."==s) return i==ss;
	for(int i=0;i<7;i++) if(s==xq[i]) return i!=day;
	return -1;
}
bool check(int day,int ss){
	b=0,c=0;
	memset(a,-1,sizeof a);
	for(int i=1;i<=p;i++){
		if(hy(day,ss,z[i].first,z[i].second)==1){
			if(a[z[i].first]==-1) a[z[i].first]=1;
			if(a[z[i].first]==0) return false;
		}
		else if(hy(day,ss,z[i].first,z[i].second)==0){
			if(a[z[i].first]==-1) a[z[i].first]=0;
			if(a[z[i].first]==1) return false;
		}
	}
	for(int i=1;i<=m;i++){
		if(a[i]==1) c++;
		else if(a[i]==-1) b++;
	}
	return c<=n&&n<=c+b;
}
int main(){
	freopen("zt.in","r",stdin);
	freopen("zt.out","w",stdout);
	cin>>m>>n>>p;
	string mz="";
	for(int i=1;i<=m;i++) cin>>name[i];
	for(int i=1;i<=p;i++){
		string first;
		cin>>first;
		first.erase(first.end()-1);
		string second; 
		getline(cin,second);
		second.erase(second.begin());
		z[i]={get_id(first),second}; 
	}
	for(int i=1;i<=m;i++){
		for(int day=0;day<7;day++){
			if(check(day,i)&&st[i]==0){
				cnt++;
				mz=name[i];
				st[i]=1; 
			}
		}
	}
	if(cnt>1) cout<<"Cannot Determine";
	else if(cnt==1) cout<<mz;
	else cout<<"Impossible";
	return 0;
}

这道题目完全没有思路,所以就放弃了,下一次不能轻易放弃。