2017年10月15日训练总结
2017-10-15 20:08
155 查看
这次训练日记是10月13日到10月15日。
总体来说,掌握了KMP模板并能够熟练运用。刚刚打了一场CF的天梯赛,感觉挺好玩,但是第二题被锁了,最后只A了一道题。。。比赛一结束就开始补题,前三道题都很快A掉。。。怀疑人生。下面先写一下这三道题的题解吧。。。
A:求最小的数,它的每一位数字出现在给定的两个序列里。
思路:先判断有没有相同的数,有的话找最小的。。。直接输出即可,没有相同数就把两个数组中最小的数字组成小的二位数即可。。。刚开始没考虑第一种情况交了两发wr。
AC代码:
B:给定一个数列,分成k部分,求k个部分的最小值,再取最大值,使它最大。
思路:分k=123的情况。刚开始没考虑k=2的情况,突然被锁不知所措,最后也没A出来。。。
AC代码:
C:给你n个数,对每个数拆分成最多数量的合数。
思路:4是最小的合数,直接除以四根据余数判断。余0直接输出,余1凑9,余2凑6,余3凑15,15=6+9。比赛的时候没考虑余3的情况。。。我是傻了么
AC代码:
至于剩下的两道题,题意都读不懂。。。更别说做了。
这三天主要是看了饶齐博客里有关KMP的知识,把模板已经完全理解并能熟练运用,getfai就是与自身匹配,find就是把b数组的前缀和a数组的后缀匹配。j表示匹配长度。f[j]=x说明a串的0到j-1字符的后缀能与a串的0到x-1字符匹配。当b[i]与a[j]不匹配的时候,就看b[i]与a[f[j]]是否匹配。本周的任务就是对KMP再练习提高,参加几场小比赛热热身,简单复习一下学过的知识,为下周的哈尔滨赛区的比赛做准备。
每天都要坚持学习。
总体来说,掌握了KMP模板并能够熟练运用。刚刚打了一场CF的天梯赛,感觉挺好玩,但是第二题被锁了,最后只A了一道题。。。比赛一结束就开始补题,前三道题都很快A掉。。。怀疑人生。下面先写一下这三道题的题解吧。。。
A:求最小的数,它的每一位数字出现在给定的两个序列里。
思路:先判断有没有相同的数,有的话找最小的。。。直接输出即可,没有相同数就把两个数组中最小的数字组成小的二位数即可。。。刚开始没考虑第一种情况交了两发wr。
AC代码:
#include<iostream> #include<cmath> #include<string> #include<string.h> #include<algorithm> #include<queue> #include<vector> #include<cstdio> #include<map> using namespace std; #define lson l,m,i<<1 #define rson m+1,r,i<<1|1 const int mx=100010; const int inf=0x7fffffff; const double PI=acos(-1.0); int max(int x,int y){if(x>y)return x;return y;} int min(int x,int y){if(x<y)return x;return y;} int c[mx]; int lb(int i){return i&(-i);} int add(int i,int d) { while(i<mx) { c[i]+=d; i+=lb(i); } } int query(int i) { int sum=0; while(i>0){ sum+=c[i]; i-=lb(i); } return sum; } int a[mx],dp[mx]; bool b[mx]; int n,m,ans; int main() { int T,i,j,k,x,y,z,sum,h; char s[mx]; while(scanf("%d%d",&n,&m)==2) { sum=inf; memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) {scanf("%d",&x);a[x]++;if(x<sum) sum=x;} int ans=inf; //scanf("%s",s); int l=0,r=inf; for(i=0;i<m;i++){scanf("%d",&x);if(a[x]>0&&x<r) r=x;if(x<ans) ans=x;} if(r!=inf) printf("%d\n",r); else if(sum<ans)printf("%d\n",sum*10+ans); else if(sum==ans) printf("%d\n",sum); else printf("%d\n",ans*10+sum); } return 0; }
B:给定一个数列,分成k部分,求k个部分的最小值,再取最大值,使它最大。
思路:分k=123的情况。刚开始没考虑k=2的情况,突然被锁不知所措,最后也没A出来。。。
AC代码:
#include<iostream> #include<cmath> #include<string> #include<string.h> #include<algorithm> #include<queue> #include<vector> #include<cstdio> #include<map> using namespace std; #define lson l,m,i<<1 #define rson m+1,r,i<<1|1 const int mx=100010; const int inf=0x7fffffff; const double PI=acos(-1.0); int max(int x,int y){if(x>y)return x;return y;} int min(int x,int y){if(x<y)return x;return y;} int c[mx]; int lb(int i){return i&(-i);} int add(int i,int d) { while(i<mx) { c[i]+=d; i+=lb(i); } } int query(int i) { int sum=0; while(i>0){ sum+=c[i]; i-=lb(i); } return sum; } int a[mx],dp[mx]; map<int,int> mp; bool b[mx]; int n,m,ans; int main() { int T,i,j,k,x,y,z,sum,sum2,h; char s[mx]; while(scanf("%d%d",&n,&k)==2) { //memset(a,0,sizeof(a)); z=0;x=0; //memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) {scanf("%d",&a[i]);if(i==0) {sum=a[i];sum2=a[i];}if(i>0&&a[i]<sum) {sum=a[i];z=i;} if(i>0&&a[i]>sum2) {sum2=a[i];x=i;} } if(k==1) printf("%d\n",sum); else if(k==2) { if(x==0||x==n-1) printf("%d\n",sum2); else { j=max(a[0],a[n-1]); printf("%d\n",j); } } else printf("%d\n",sum2); //scanf("%s",s); //memset(c,0,sizeof(c)); } return 0; }
C:给你n个数,对每个数拆分成最多数量的合数。
思路:4是最小的合数,直接除以四根据余数判断。余0直接输出,余1凑9,余2凑6,余3凑15,15=6+9。比赛的时候没考虑余3的情况。。。我是傻了么
AC代码:
#include<iostream> #include<cmath> #include<string> #include<string.h> #include<algorithm> #include<queue> #include<vector> #include<cstdio> #include<map> using namespace std; #define lson l,m,i<<1 #define rson m+1,r,i<<1|1 const int mx=100010; const int inf=0x7fffffff; const double PI=acos(-1.0); int max(int x,int y){if(x>y)return x;return y;} int min(int x,int y){if(x<y)return x;return y;} int c[mx]; int lb(int i){return i&(-i);} int add(int i,int d) { while(i<mx) { c[i]+=d; i+=lb(i); } } int query(int i) { int sum=0; while(i>0){ sum+=c[i]; i-=lb(i); } return sum; } int a[mx],dp[mx]; map<int,int> mp; bool b[mx]; int n,m,ans; int main() { int T,i,j,k,x,y,z,sum,sum2,h; char s[mx]; while(scanf("%d",&n)==1) { //memset(a,0,sizeof(a)); //memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) {scanf("%d",&h); sum=h%4; sum2=h/4; if(sum==0) printf("%d\n",sum2); else if(sum==1){ if(sum2>=2) printf("%d\n",sum2-1); else puts("-1"); } else if(sum==2){ if(sum2>=1) printf("%d\n",sum2); else puts("-1"); } else { if(sum2>=3) printf("%d\n",sum2-1); else puts("-1"); } } } return 0; }
至于剩下的两道题,题意都读不懂。。。更别说做了。
这三天主要是看了饶齐博客里有关KMP的知识,把模板已经完全理解并能熟练运用,getfai就是与自身匹配,find就是把b数组的前缀和a数组的后缀匹配。j表示匹配长度。f[j]=x说明a串的0到j-1字符的后缀能与a串的0到x-1字符匹配。当b[i]与a[j]不匹配的时候,就看b[i]与a[f[j]]是否匹配。本周的任务就是对KMP再练习提高,参加几场小比赛热热身,简单复习一下学过的知识,为下周的哈尔滨赛区的比赛做准备。
每天都要坚持学习。
相关文章推荐
- 训练总结8.10
- 2013_CSUST暑假训练总结
- 第十五周训练总结(二)
- 寒假训练2018.2.2训练日志------贪心基础题目练习总结(二)
- 2013-5-27 训练赛后总结
- 2014专题训练之动态规划总结
- 华为机试训练做题总结(一)
- 2017开学训练第十二周周中总结
- 2015-2016 ACM-ICPC Southwestern Europe Regional Contest (SWERC 15)训练总结【7/10】
- 寒假训练的小总结
- 拓展训练总结(二)
- 暑假集训之思维训练 总结 加自己a题
- 训练总结
- 训练总结 9.11
- 深度学习训练的小技巧,调参经验。总结与记录
- 2017.10.19开学第八周周中训练总结
- 训练总结
- 第十三周训练总结(二)
- 2018寒假训练总结
- ACM暑假训练总结