测试 3

来源:互联网 发布:java闰年判断 编辑:程序博客网 时间:2024/05/17 10:07

t1
del
去一个重,在特判一下

#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;int n,k,a[110000];int main(){    freopen("del.in","r",stdin);    freopen("del.out","w",stdout);    scanf("%d%d",&n,&k);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    sort(a+1,a+n+1);    int ans=unique(a+1,a+n+1)-(a+1);    if(n-ans>=k) printf("%d",ans);    else printf("%d",n-k);} 

t2
chess
简单的搜索题,递归模拟,没啥优化剪枝。。。
不知怎么搞的’,’忘加了。。
然后走一步的特判在程序里错了,弄出去就对了。。。

#include<cstdio>#include<iostream>using namespace std;struct st{    int maxn,cnt; };int a[11][11],b[11][11];int xx[]={1,1,-1,-1};int yy[]={1,-1,-1,1};int ans,ans2[11][11];char s[19];st dfs(int x,int y,int opt,int s){    int tot=0,num=1;    if(!s)    {        for(int i=0;i<4;i++)        if(i!=opt)        {        if(x+xx[i]>10&&y+yy[i]>10&&y+yy[i]<=0&&x+xx[i]<=0)continue;        if(a[x+xx[i]][y+yy[i]]==0) continue;        if(a[x+xx[i]][y+yy[i]]==2&&x+xx[i]+xx[i]<=10&&y+yy[i]+yy[i]<=10&&y+2*yy[i]>0&&x+2*xx[i]>0&&a[x+xx[i]+xx[i]][y+yy[i]+yy[i]]==0){            a[x+xx[i]][y+yy[i]]=0;            st w=dfs(x+xx[i]+xx[i],y+yy[i]+yy[i],(i+2)%4,s);            a[x+xx[i]][y+yy[i]]=2;            if(w.maxn+1>tot){                num=w.cnt;                tot=w.maxn+1;            }            else if(w.maxn+1==tot) num+=w.cnt;        }        }    }    else    for(int i=0;i<4;i++)    if(i!=opt)    {        int t=1;        while(x+t*xx[i]<=10&&y+t*yy[i]<=10&&y+t*yy[i]>0&&x+t*xx[i]>0&&!a[x+t*xx[i]][y+t*yy[i]]) t++;        if(x+t*xx[i]>10&&y+t*yy[i]>10&&y+t*yy[i]<=0&&x+t*xx[i]<=0)continue;        if(a[x+t*xx[i]][y+t*yy[i]]==1) continue;        a[x+t*xx[i]][y+t*yy[i]]=0;        int ww=t;        t++;        while(x+t*xx[i]<=10&&y+t*yy[i]<=10&&y+t*yy[i]>0&&x+t*xx[i]>0&&!a[x+t*xx[i]][y+t*yy[i]]){            st w=dfs(x+t*xx[i],y+t*yy[i],(i+2)%4,s);            if(w.maxn+1>tot){                num=w.cnt;                tot=w.maxn+1;            }            else if(w.maxn+1==tot) num+=w.cnt;            t++;        }         a[x+ww*xx[i]][y+ww*yy[i]]=2;    }    st tmp;    tmp.maxn=tot;    tmp.cnt=num;    return tmp;}int num[11][11],num3,num4[11][11];int main(){    freopen("chess.in","r",stdin);    freopen("chess.out","w",stdout);    for(int i=1;i<=10;i++)      {        cin>>s+1;        for(int j=1;j<=10;j++)        a[i][j]=s[j]-'0';    }    for(int i=1;i<=10;i++)    {        cin>>s+1;        for(int j=1;j<=10;j++)        b[i][j]=s[j]-'0';    }    //dfs(6,7,4,0);    for(int i=1;i<=10;i++)    for(int j=1;j<=10;j++)    if(a[i][j]==1)    {            if(!b[i][j])            {                for(int k=2;k<4;k++)                if(i+xx[k]<=10&&j+yy[k]<=10&&j+yy[k]>0&&i+xx[k]>0&&!a[i+xx[k]][j+yy[k]])                num3++,num4[i][j]++;            }            else if(b[i][j]){                for(int k=0;k<4;k++)                {                    int t=1;                while(i+t*xx[k]<=10&&j+t*yy[k]<=10&&j+t*yy[k]>0&&i+t*xx[k]>0&&!a[i+t*xx[k]][j+t*yy[k]]) t++,num3++,num4[i][j]++;                }            }            st w=dfs(i,j,4,b[i][j]);        //printf("%d %d %d %d\n",i,j,w.maxn,w.cnt);            if(w.maxn>ans){                num[i][j]=w.cnt;                ans2[i][j]=w.maxn;                ans=w.maxn;            }            else if(w.maxn==ans) ans2[i][j]=w.maxn,num[i][j]+=w.cnt;    }    if(!ans){        printf("%d\n",num3);        for(int i=1;i<=10;i++)        for(int j=1;j<=10;j++)        if(num4[i][j])        for(int k=1;k<=num4[i][j];k++)        printf("(%d %d)\n",i,j);    }    else {            int num2=0;    for(int i=1;i<=10;i++)    for(int j=1;j<=10;j++)    if(ans==ans2[i][j])     num2=num2+num[i][j];    printf("%d\n",num2);    for(int i=1;i<=10;i++)    for(int j=1;j<=10;j++)    if(ans==ans2[i][j])    for(int k=1;k<=num[i][j];k++)    printf("(%d %d)\n",i,j);    }}

t3
bonus
状压dp+期望。
dp[i][s]表示吃i个馅饼,s用二进制表示之前吃过哪些馅饼
倒着推,最后是零个馅饼

#include<cstdio>#include<iostream>using namespace std;int k,n,need[1<<16],f;double dp[109][1<<16],a[11999]; int main(){    freopen("bonus.in", "r", stdin);    freopen("bonus.out", "w", stdout);    scanf("%d%d",&k,&n);    for(int i=1;i<=n;i++)    {        scanf("%lf",&a[i]);        int x;        scanf("%d",&x);        while(x!=0){            need[i]+=1<<(x-1);            scanf("%d",&x);        }    }    for(int i=k;i>=1;i--)    for(int s=0;s<=(1<<n)-1;s++)    {        for(int j=1;j<=n;j++)        {        if((s&need[j])==need[j])         dp[i][s]+=max(dp[i+1][s|(1<<j-1)]+a[j],dp[i+1][s]);        else dp[i][s]+=dp[i+1][s];       }       dp[i][s]/=(double)n;    }    printf("%.6lf",dp[1][0]);} 
原创粉丝点击