20171019测试

来源:互联网 发布:医疗数据分析师 编辑:程序博客网 时间:2024/05/21 20:46


得分:100 + 0 + 20

T1还好DP写出来了

T2 ME 哎 不知道怎么想的 就算是bool 也不该开那么大的 不然可以拿30 分的

T3 暴力枚举30分+特判20分 只得了10分

考试的时候还是要拿稳 送的分

T1 打牌(Poke)

题意:

给 n个数 可以出一对或者三个连续数字组成的顺子

输入


1 1 1 2 2 2 3 3 3

输出

4

贪心或者DP

#include<bits/stdc++.h>using namespace std;int n,t[1000005],f[1000000][2];int j,k,p0,n0,k0,a0,a1,p1,n1,k1,maxx,x,p,q;int read(){int i=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar());for(;ch<='9'&&ch>='0';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';return i;}int main(){//freopen("poke.in","r",stdin);//freopen("poke.out","w",stdout);n=read();for(int i=1;i<=n;++i){x=read();t[x]++;maxx=max(maxx,x);}for(int i=1;i<=maxx;++i){j=p0,k=n0;p=p1,q=n1;k0=min(j,min(k,t[i]%2));a0=f[i-1][0]+k0;k1=min(p,min(q,t[i]%2));a1=f[i-1][1]+k1;if(a0<a1){f[i][0]=a1+t[i]/2;p0=q-k1;n0=t[i]%2-k1;}else{f[i][0]=a0+t[i]/2;p0=k-k0;n0=t[i]%2-k0;}k0=min(j,min(k,t[i]));a0=f[i-1][0]+k0;k1=min(p,min(q,t[i]));a1=f[i-1][1]+k1;if(a0<=a1){f[i][1]=a1+(t[i]-k1)/2;p1=q-k1;n1=(t[i]-k1)%2;}else{f[i][1]=a0+(t[i]-k0)/2;p1=k-k0;n1=(t[i]-k0)%2;}}cout<<max(f[maxx][0],f[maxx][1]);return 0;}

T2 弹球(Ball)

T组数据 每组n,m表示地板的长和宽 球从左上角 45°向右下角发射 碰到边缘后反弹 直到达到某个角落

#include<bits/stdc++.h>#define ll long long using namespace std;ll T,n,m,x,y,ans,g;ll read(){ll i=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar());for(;ch<='9'&&ch>='0';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';return i;}ll gcd(ll a,ll b){ll t;while(a%b){t=a;a=b;b=t%b;}return b;}int main(){//freopen("ball.in","r",stdin);//freopen("ball.out","w",stdout);T=read();while(T--){n=read()-1;m=read()-1;g=gcd(n,m);ans=n*m/g+1;ans-=(ans/n-1)*(ans/m-1);cout<<ans<<endl;}return 0;}