高一阶段测试-2021.4.21
作者:互联网
建议改名:冬天丶的雨的生日派对(没错今天是我生日awa)
A. Efim与奇怪的成绩
B. 美丽的IP地址
C. Tic-tac-toe
D. 小 X 与煎饼达人
赛时得分:320
排行:1
开场先切T1
一个裸的四舍五入模拟题……判断整数进位了但一开始没删小数点
由于是IOI很快就发现了bug,拿到一血
A. Efim与奇怪的成绩
非常显然
#include<cstdio> #include<iostream> #include<cstring> #include<string> #define WR WinterRain using namespace std; const int WR=1001000; char ch[WR]; int a[WR],b[WR],cnt,tot,tag,pnt; int n,m; int read(){ int s=0,w=1; char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-') w=-1; ch=getchar(); } while(ch<='9'&&ch>='0'){ s=(s<<1)+(s<<3)+ch-48; ch=getchar(); } return s*w; } int main(){ freopen("grade.in","r",stdin); freopen("grade.out","w",stdout); n=read(),m=read(); scanf("%s",ch+1); bool flag=false; for(int i=1;i<=n;i++){ if(ch[i]=='.'){flag=true,pnt=i;continue;}
//一开始这里寄了没判断点,输入99.9999我会输出100. if(flag) a[++cnt]=ch[i]-48; else b[++tot]=ch[i]-48; } tag=cnt; for(int i=1;i<=min(n,m);i++){ flag=false; for(int j=1;j<=tag;j++){ if(a[j]>=5){ flag=true; a[j-1]++,tag=j-1; break; } } if(!flag) break; } flag=true; if(a[0]) b[tot]++,flag=false; int tmp=tot; while(b[tmp]>=10){ b[tmp]-=10; b[tmp-1]++; tmp--; } if(b[0]) printf("%d",b[0]); for(int i=1;i<=tot;i++){ printf("%d",b[i]); } if(flag) putchar('.'); for(int i=1;i<=tag;i++){ printf("%d",a[i]); } fclose(stdin); fclose(stdout); return 0; }
挺合理的。
然后看怎么kiritokazuto大佬和joke大佬都切了T4???
D. 小 X 与煎饼达人
略作思考:
线段树!
然鹅打到一半发现伪了,滚回去做差分(这不校门外的树么。。。)
//Happy Birthday!!! #include<cstdio> #include<iostream> #include<cstring> #include<string> #define WR WinterRain using namespace std; const int WR=1001000; int n,m; int a[WR],cnt,ans; int read(){ int s=0,w=1; char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-') w=-1; ch=getchar(); } while(ch<='9'&&ch>='0'){ s=(s<<1)+(s<<3)+ch-48; ch=getchar(); } return s*w; } int main(){ freopen("flip.in","r",stdin); freopen("flip.out","w",stdout); n=read(),m=read(); for(int i=1;i<=m;i++){ int x,y; x=read(),y=read(); a[x]++,a[y+1]--; } for(int i=1;i<=n;i++){ cnt+=a[i]; if(cnt%2) ans++; } printf("%d",ans); fclose(stdin); fclose(stdout); return 0; }
四十五分钟切了T4。。。此刻还剩五十分钟,看了眼T2发现不是很可做
滚去看T3
Tic-tac-toe
emm……这个我熟啊,初三玩了半年的(bushi
看了看发现就是简单的硬判断,直接打模拟
然鹅代码有点冗长……
有几种非常诡异的情况:
1. 如果其中一方连着下了好几步? illegal
2. 如果两个人同时都赢了? illegal
为啥只输出illegal能拿50分啊……
#include<cstdio> #include<iostream> #include<cstring> #include<string> #define WR WinterRain using namespace std; const int WR=100; char mp[WR][WR]; int cnta,cntb; bool fa,fb; int main(){ freopen("tic.in","r",stdin); freopen("tic.out","w",stdout); for(int i=1;i<=3;i++){ for(int j=1;j<=3;j++){ cin>>mp[i][j]; if(mp[i][j]=='X') cnta++; if(mp[i][j]=='0') cntb++; } } if(cnta<cntb||cnta>5||cntb>5||((cnta!=cntb)&&(cnta-cntb!=1))){ printf("illegal"); fclose(stdin); fclose(stdout); return 0; } for(int i=1;i<=3;i++){ if(mp[i][1]==mp[i][2]&&mp[i][2]==mp[i][3]){ if(mp[i][1]=='X') fa=true; if(mp[i][1]=='0') fb=true; } if(mp[1][i]==mp[2][i]&&mp[2][i]==mp[3][i]){ if(mp[1][i]=='X') fa=true; if(mp[1][i]=='0') fb=true; } } if(mp[1][1]==mp[2][2]&&mp[2][2]==mp[3][3]){ if(mp[1][1]=='X') fa=true; if(mp[1][1]=='0') fb=true; } if(mp[1][3]==mp[2][2]&&mp[2][2]==mp[3][1]){ if(mp[1][3]=='X') fa=true; if(mp[1][3]=='0') fb=true; } if(fa==fb&&fa==true){ printf("illegal"); fclose(stdin); fclose(stdout); return 0; } if(fa){ printf("the first player won"); fclose(stdin); fclose(stdout); return 0; } if(fb){ printf("the second player won"); fclose(stdin); fclose(stdout); return 0; } if(!fa&&!fb&&cnta==5&&cntb==4){ printf("draw"); fclose(stdin); fclose(stdout); return 0; } if(cnta==cntb){ printf("first"); fclose(stdin); fclose(stdout); return 0; } if(cnta==cntb+1){ printf("second"); fclose(stdin); fclose(stdout); return 0; } fclose(stdin); fclose(stdout); return 0; }
为了AK只能肝T2了。。。
美丽的IP地址
我的天可恶的大深搜
可以枚举前三位,第四位能轻易地推出来
赛时只有20分然鹅是因为没写完……拿了一个输出0的部分分……
赛后改过了,确实还是比较恶心的
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<vector> #define WR WinterRain using namespace std; const int WR=100; int n,a[WR]; vector<int>s; int res; int num[WR],tmp[WR],ans; int read(){ int s=0,w=1; char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-') w=-1; ch=getchar(); } while(ch<='9'&&ch>='0'){ s=(s<<1)+(s<<3)+ch-48; ch=getchar(); } return s*w; } void add(int x){ if(!x) return; add(x/10); s.push_back(x%10); } bool check(){ for(int i=0;i<=9;i++) if(!num[i]&&tmp[i]) return false; return true; } int get(){ for(int i=0;i<s.size();i++) if(s[i]!=s[s.size()-1-i]) return 0; return 1; } bool judge(int x){ if(!x) return true; num[x%10]++; return judge(x/10)&&tmp[x%10]; } void pushup(int x){ if(!x) return; num[x%10]--; pushup(x/10); } int query(int a,int b,int c){ s.clear();//vector存,丝滑~ res=0; add(a/10),s.push_back(a%10); add(b/10),s.push_back(b%10); add(c/10),s.push_back(c%10); s.push_back(s[0]); res+=get(); s[s.size()-1]=s[1]; s.push_back(s[0]); if(s[1]) res+=get(); if(s[2]*100+s[1]*10+s[0]<=255&&s[2]){ s[s.size()-2]=s[2]; s[s.size()-1]=s[1]; s.push_back(s[0]); res+=get(); } return res; } int main(){ freopen("ipadd.in","r",stdin); freopen("ipadd.out","w",stdout); n=read(); for(int i=1;i<=n;i++){ int x=read(); tmp[x]=1; } for(int i=0;i<=255;i++){ num[i%10]++;//这里一定要加1!!!否则judge会直接返回true而不会加num if(judge(i/10)&&tmp[i%10]) for(int j=0;j<=255;j++){ num[j%10]++; if(judge(j/10)&&tmp[j%10]) for(int k=0;k<=255;k++){ num[k%10]++; if(judge(k/10)&&tmp[k%10]&&check()) ans+=query(i,j,k); num[k%10]--; pushup(k/10); } num[j%10]--; pushup(j/10); } num[i%10]--; pushup(i/10); } printf("%d",ans); fclose(stdin); fclose(stdout); return 0; }
这次比赛还是比较简单的,算是普及组难度(?
今后也要继续努力QWQ!
标签:tmp,ch,21,int,高一,++,WR,include,2021.4 来源: https://www.cnblogs.com/WintersRain/p/16184334.html