ccf刷题记02
来源:互联网 发布:mac版的rar 解压软件 编辑:程序博客网 时间:2024/05/28 23:19
这是我第一参加ccf的题,第一次参加就做了三题,虽然分没拿全,但也确实可喜可贺,然而代码已无存,无妨,再做一次又如何,当年做了5h,看现在自己进步了多少吧
感觉还可以,5min,a题,20min,b题,最后总耗时1h左右成功三题,相比于之前,进步还是相当可观的,加油
201609-1 最大波动
思路:这题又是水题,扫一遍数组,统计一下最大值就好了
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;int myabs(int a){ if(a<0) { a *= (-1); } return a;}int main(){ int n; while(scanf("%d",&n)!=EOF) { int la,now; int maxchange = 0; scanf("%d",&la); for(int i=1;i<n;i++) { scanf("%d",&now); if(myabs(now-la)>maxchange) { maxchange = myabs(now-la); } la = now; } printf("%d\n",maxchange); } return 0;}
201609-2 火车购票
思路:预处理每排最大连续座位,模拟安排策略就好了,最后注意一下把座位转化成座位号,对于连续座位的维护,因为n特别小,每次更改都O(n)暴力维护一下就好了
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;bool seat[20][5];int maxseat[20];int main(){ memset(seat,false,sizeof(seat)); for(int i=0;i<20;i++) { maxseat[i] = 5; } int n; scanf("%d",&n); while(n--) { int p; scanf("%d",&p); int lin; for(lin=0;lin<20;lin++) { if(maxseat[lin]>=p) { int st; for(st=0;st<5;st++) { int row; for(row=0;row<p;row++) { if(seat[lin][st+row]) { break; } } if(row == p) { break; } } for(int row=0;row<p;row++) { seat[lin][st+row] = true; if(row==p-1) { printf("%d\n",lin*5+st+row+1); } else { printf("%d ",lin*5+st+row+1); } } int realnowmaxseat = 0; int nowmaxseat = 0; for(int row=0;row<5;row++) { if(!seat[lin][row]) { nowmaxseat++; } else { if(nowmaxseat>realnowmaxseat) { realnowmaxseat = nowmaxseat; } nowmaxseat = 0; } } if(nowmaxseat>realnowmaxseat) { realnowmaxseat = nowmaxseat; } maxseat[lin] = realnowmaxseat; break; } } if(lin == 20) { for(int i=0;p>0&&i<20;i++) { for(int j=0;p>0&&j<5;j++) { if(!seat[i][j]) { seat[i][j] = true; p--; if(p==0) { printf("%d\n",i*5+j+1); break; } else { printf("%d ",i*5+j+1); } int realnowmaxseat = 0; int nowmaxseat = 0; for(int row=0;row<5;row++) { if(!seat[i][row]) { nowmaxseat++; } else { if(nowmaxseat>realnowmaxseat) { realnowmaxseat = nowmaxseat; } nowmaxseat = 0; } } if(nowmaxseat>realnowmaxseat) { realnowmaxseat = nowmaxseat; } maxseat[i] = realnowmaxseat; } } } } } return 0;}
201609-2 炉石传说
思路:建立一个随从数据结构,将英雄处理为第0个随从,并将死亡的随从攻击了记为0,同样是n十分小,每次都O(n)模拟即可,细心最关键
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;typedef struct FOLLOWER{ int health; int attack;}Follower;Follower f[2][10];int main(){ int n; scanf("%d",&n); memset(f,-1,sizeof(f)); f[0][0].health = 30; f[0][0].attack = 0; f[1][0].health = 30; f[1][0].attack = 0; //memset(fB,-1,sizeof(fB)); //cout << fA[0].attack << " " << fA[0].health << " " << fA[6].health << " " << fA[6].attack<<endl; int now = 0; while(n--) { char temp[10]; scanf("%s",temp); if(strcmp(temp,"end")==0) { now = (now + 1) % 2; } else if (strcmp(temp,"summon")==0) { int pos; scanf("%d",&pos); for(int i=6;i>=pos;i--) { f[now][i+1] = f[now][i]; } scanf("%d%d",&f[now][pos].attack,&f[now][pos].health); } else { int a,b; scanf("%d%d",&a,&b); int nex = (now + 1) % 2; f[now][a].health = f[now][a].health - f[nex][b].attack; f[nex][b].health = f[nex][b].health - f[now][a].attack; if(f[now][a].health<=0) { for(int i=a;i<7;i++) { f[now][i] = f[now][i+1]; } f[now][7].attack = -1; f[now][7].health = -1; } if(f[nex][b].health<=0) { if(b==0) { break; } for(int i=b;i<7;i++) { f[nex][b] = f[nex][i+1]; } f[nex][7].attack = -1; f[nex][7].health = -1; } } } if(f[0][0].health <= 0) { printf("-1\n"); } else if(f[1][0].health <= 0) { printf("1\n"); } else { printf("0\n"); } printf("%d\n",f[0][0].health); int len1; for(len1=1;len1<=7;len1++) { if(f[0][len1].attack==-1) { break; } } len1--; printf("%d",len1); for(int i=1;i<=len1;i++) { printf(" %d",f[0][i].health); } printf("\n"); printf("%d\n",f[1][0].health); int len2; for(len2=1;len2<=7;len2++) { if(f[1][len2].attack==-1) { break; } } len2--; printf("%d",len2); for(int i=1;i<=len2;i++) { printf(" %d",f[1][i].health); } printf("\n"); return 0;}
然而,90分,被卡了,心塞塞的
看来还是细节问题,数据很可能出现什么比较坑的地方,比如负攻击了啊这些的,所以,还是自己老老实实开个数组统计人数吧,其他也没啥
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;typedef struct FOLLOWER{ int health; int attack;}Follower;Follower f[2][10];int num[2] = {0,0};int main(){ int n; scanf("%d",&n); //memset(f,-1,sizeof(f)); f[0][0].health = 30; f[0][0].attack = 0; f[1][0].health = 30; f[1][0].attack = 0; //memset(fB,-1,sizeof(fB)); //cout << fA[0].attack << " " << fA[0].health << " " << fA[6].health << " " << fA[6].attack<<endl; int now = 0; while(n--) { char temp[10]; scanf("%s",temp); if(strcmp(temp,"end")==0) { now = (now + 1) % 2; } else if (strcmp(temp,"summon")==0) { int pos; scanf("%d",&pos); for(int i=num[now];i>=pos;i--) { f[now][i+1] = f[now][i]; } scanf("%d%d",&f[now][pos].attack,&f[now][pos].health); num[now]++; } else { int a,b; scanf("%d%d",&a,&b); int nex = (now + 1) % 2; f[now][a].health -= f[nex][b].attack; f[nex][b].health -= f[now][a].attack; if(f[now][a].health<=0) { for(int i=a;i<num[now];i++) { f[now][i] = f[now][i+1]; } f[now][7].attack = -1; f[now][7].health = -1; num[now]--; } if(f[nex][b].health<=0) { if(b==0) { break; } for(int i=b;i<num[nex];i++) { f[nex][b] = f[nex][i+1]; } f[nex][7].attack = -1; f[nex][7].health = -1; num[nex]--; } } } if(f[0][0].health <= 0) { printf("-1\n"); } else if(f[1][0].health <= 0) { printf("1\n"); } else { printf("0\n"); } printf("%d\n",f[0][0].health); int len1 = num[0]; /*for(len1=1;len1<=7;len1++) { if(f[0][len1].attack==-1) { break; } } len1--;*/ printf("%d",len1); for(int i=1;i<=len1;i++) { printf(" %d",f[0][i].health); } printf("\n"); printf("%d\n",f[1][0].health); int len2 = num[1]; /*for(len2=1;len2<=7;len2++) { if(f[1][len2].attack==-1) { break; } } len2--;*/ printf("%d",len2); for(int i=1;i<=len2;i++) { printf(" %d",f[1][i].health); } printf("\n"); return 0;}
阅读全文
1 0
- ccf刷题记02
- ccf刷题记01
- ccf刷题记03
- ccf刷题记04
- ccf刷题记终级版01
- OI刷题记录
- LeetCode刷题记
- OI刷题记录~
- leetcode刷题记录
- 刷题记录
- LeetCode刷题记
- LeetCode刷题记 2
- LeetCode刷题记 3
- 6.22刷题记录
- 7.26-刷题记录
- hdu 刷题记录
- 面试刷题记录
- 每日刷题记录
- 数据库开发技术 课堂笔记5
- Restful Api写法心得之三《返回值篇》
- test
- ABB开发学习笔记
- Colossal Fibonacci Numbers! UVA
- ccf刷题记02
- 栈
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
- 176. Second Highest Salary
- Android 设计模式之观察者模式
- 2.2.9同一个类的不同静态方法不同实例不同线程是同步的
- 疫苗:JAVA HASHMAP的死循环
- linux命令详解(cp命令)
- CodeForces 158E Phone Talks dp