您的位置:首页 > 其它

2017年10月15日训练总结

2017-10-15 20:08 155 查看
这次训练日记是10月13日到10月15日。

总体来说,掌握了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再练习提高,参加几场小比赛热热身,简单复习一下学过的知识,为下周的哈尔滨赛区的比赛做准备。

每天都要坚持学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  训练日记 acm