NOIP模拟10.24

来源:互联网 发布:淘宝收取费用 编辑:程序博客网 时间:2024/05/22 06:15

2015提高D1
A.神奇的幻方。 这不今年初赛题么。。AC
B.信息传递。 这题卡了许久。。大概是老了。。%%%elijahqi
C.斗地主。 超级大爆搜,先把顺子都搜索枚举了,然后剩下的牌贪心。

A

#include <bits/stdc++.h>using namespace std;#define ll long long#define N 40#define inf 0x3f3f3f3finline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,a[N][N];int main(){//  freopen("a.in","r",stdin);    n=read();int x=1,y=n/2+1;a[x][y]=1;    for(int i=2;i<=n*n;++i){        if(x==1&&y==n) x=2;        else if(x==1) x=n,y++;        else if(y==n) x--,y=1;        else if(!a[x-1][y+1]) x--,y++;        else x++;a[x][y]=i;    }for(int i=1;i<=n;++i){        for(int j=1;j<=n;++j) printf("%d ",a[i][j]);puts("");    }return 0;}

B

#include <bits/stdc++.h>using namespace std;#define ll long long#define N 200010#define inf 0x3f3f3f3finline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,to[N],dfn[N],num=0,ans=inf;bool f[N];void dfs(int x){    dfn[x]=++num;f[x]=1;    if(dfn[to[x]]){        if(f[to[x]]) ans=min(ans,num+1-dfn[to[x]]);        f[x]=0;return;    }else dfs(to[x]),f[x]=0;}int main(){//  freopen("b.in","r",stdin);    n=read();for(int i=1;i<=n;++i) to[i]=read();    for(int i=1;i<=n;++i) if(!dfn[i]) dfs(i);    printf("%d\n",ans);    return 0;}

C

#include <bits/stdc++.h>using namespace std;#define ll long long#define N 15#define inf 0x3f3f3f3finline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int tst,n,a[N],ans=30;void solve(int res){//剩下的牌贪心搞     int num[5];memset(num,0,sizeof(num));    for(int i=0;i<=14;++i)  num[a[i]]++;    while(num[4]){        if(num[1]>=2) num[1]-=2,num[4]--;        else if(num[2]>=2) num[2]-=2,num[4]--;        else if(num[1]==0&&num[2]==1) num[2]--,num[4]--;        else break;res++;    }while(num[3]){        if(num[1]) num[1]--,num[3]--;        else if(num[2]) num[2]--,num[3]--;        else break;res++;    }while(num[4]>=2) num[4]-=2,res++;    while(num[3]>=3) num[3]-=3,res+=2;    res+=num[1]+num[2]+num[3]+num[4];    ans=min(res,ans);}void dfs(int res){    for(int i=3;i<=10;++i){//处理单顺        if(!a[i]||!a[i+1]||!a[i+2]||!a[i+3]||!a[i+4]) continue;        a[i]--;a[i+1]--;a[i+2]--;a[i+3]--;a[i+4]--;int x=5;        dfs(res+1);while(i+x<=14&&a[i+x]) a[i+x]--,dfs(res+1),x++;        while(x) x--,a[i+x]++;    }for(int i=3;i<=12;++i){//处理双顺        if(a[i]<2||a[i+1]<2||a[i+2]<2) continue;        a[i]-=2;a[i+1]-=2;a[i+2]-=2;int x=3;        dfs(res+1);while(i+x<=14&&a[i+x]>=2) a[i+x]-=2,dfs(res+1),x++;        while(x) x--,a[i+x]+=2;    }for(int i=3;i<=13;++i){        if(a[i]<3||a[i+1]<3) continue;        a[i]-=3;a[i+1]-=3;int x=2;        dfs(res+1);while(i+x<=14&&a[i+x]>=3) a[i+x]-=3,dfs(res+1),x++;        while(x) x--,a[i+x]+=3;    }solve(res);}int main(){//  freopen("a.in","r",stdin);//  freopen("a.out","w",stdout);    tst=read();n=read();    while(tst--){        memset(a,0,sizeof(a));ans=30;        for(int i=1;i<=n;++i){            int x=read(),y=read();if(x==1) a[14]++;else a[x]++;        }dfs(0);        printf("%d\n",ans);    }return 0;}