- 张家宁 的博客
八月DAY1
- @ 2024-8-10 18:42:13
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. 侦探推理
思路
大大大模拟!!
具体思路
- 将所有的数据输入,并且判断是哪种类型
- 枚举谁是罪犯,并且枚举日期。
- 写一个函数,用来判断说谎的人数。
- 如果说谎的人数小于并且说谎的人数加上说废话的人数,就是嫌疑犯。
- 提示:说谎的人数与废话的人数是按人头记
代码
#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;
}
反思
我在看这道题时以为是模拟人脑吓了一大跳!所以没做。
以后应当思考暴力会不会超时再思考。
同时,我在复现赛的时候做错了好多次,总结如下:
- 第一种:不是按人头计数。
- 没有判断不成立情况。
- 当是没有用函数,导致做题不好检查。第二次好多了!
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的理解不深刻,没做。
复现赛:
我当时想当然地将,可却忘了这是破环成链。所以应当将结果求最大值(长度为n)