1010 Reports
题目意思和请假有关,但是本质上的要求是“当且仅当不存在两个连续且相同的报告时”,也就是1和0必须交错存在
做法先输入再判断即可
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; const int maxx=1e6+1; char s[maxx]; int a[maxx]; int main(){ int n; scanf("%d",&n); while(n--){ int len; cin>>len; for(int i=0;i<len;i++){ cin>>a[i]; } int flag=0; for(int i=1;i<len;i++){ if(a[i]==a[i-1]){ flag=1; break; } } if(flag==1){ printf("NO\n"); }else{ printf("YES\n"); } } }
1003 Express Mail Taking
这个题的意思就是说有一排快递柜,是由1~n编号的,大门的位置在1好柜子处,其次有m封信,k号柜的地方可以获取密码,每次要取柜子里的东西都必须先到k号柜子的地方拿密码。
题目要求是给出一些柜子的编号,一个柜子只有一封信,问从门的地方出发拿到所有信并且返回门的位置的最短路径是多少
做法就是搞两个数组,将每一次过程拆成两个部分,第一个数组存从密码柜取到密码之后到柜子拿到信,再返回密码柜的距离;第二个数组存从密码柜到信封再回到初始地点的距离,循环比较,看看把哪个柜子作为最后一个最合适(因为中间的过程都是密码→柜子→密码)
如此就求出来了
(对了题目说了不能用cin,会超时)
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; const int maxx=1e6+1; int a[maxx],b[maxx],c[maxx]; int main(){ int t; scanf("%d",&t); while(t--){ int n,m,k; scanf("%d %d %d",&n,&m,&k); for(int i=0;i<m;i++){ scanf("%d",&a[i]); } int minn=0; long long int sum=0; for(int i=0;i<m;i++){ b[i]=abs(a[i]-k+a[i]-k); sum+=b[i]; c[i]=abs(a[i]-k)+a[i]-1; if(i!=0&&(c[i]-b[i])<(c[minn]-b[minn])){ minn=i; } } printf("%lld\n",sum+c[minn]-b[minn]+k-1); } }
1007 CCPC Training Class
题目挺唬人的,意思是说取一个字符串,之后取出一部分来,要求取出来的这部分前半部分和后半部分相同,求取出来的最大长度
重点是最后一句话,说可以任意调整字符的位置,然后再看看样例,就蒙一蒙,找出字符串里重复次数最多的字符,把他们都移到前面去,这部分长度就是答案了
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; const int maxx=1e6+1; char s[maxx]; int main(){ int n,num=0; scanf("%d",&n); num=n; while(n--){ printf("Case #%d: ",num-n); scanf("%s",&s); int len=strlen(s); sort(s,s+len); int sum1=1; int sum2=0; for(int i=1;i<len;i++){ if(s[i]==s[i-1]){ sum1++; }else{ sum2=max(sum1,sum2); sum1=1; } } printf("%d\n",sum2); } }
至于……1011的那个矩阵,我是真的看不明白了……做的时候就一脸蒙,本来线代就学的不好吧,英语也不怎么样,所以研究了很久还没读懂题就放弃了
最后说说感觉
-
因为很多事情导致很久没正儿八经打过代码了,确实应该被教训一下,不能给自己找借口,一上手懵懵的,读题都得读半天,很不应该,应该将学习和训练提上日程了
-
做题方面的话,感觉一次不需要将题目读透,可以先看看样例,说不定就明白怎么做了(比如1007,真还就是这么出来的),某些题故意用很复杂的题干干扰,得学会看本质,看重要的内容,不然很可能迷失在英语阅读里,浪费时间,打击信心
-
很多题会给出类似提示之类的句子,比如1007和1003里都有类似的内容
-
总之的总之,接下来需要好好练了,自己欠缺的可不是一星半点,组队赛还可以团队合作,可一个人上就有些捉襟见肘了,不管什么时候,自己的实力永远是最重要的
以上