- 吴易繁 的博客
8(八)月(暑期)集训DAY01
- @ 2024-8-5 16:12:26
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;
}
这道题目完全没有思路,所以就放弃了,下一次不能轻易放弃。