NOIP2015提高组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2015提高组相关的知识,希望对你有一定的参考价值。

D1

T1 神奇的幻方

 

一道大水题

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n;
 5 int ans[40][40];
 6 inline int qread()
 7 {
 8     int x=0,j=1;
 9     char ch=getchar();
10     while(ch<0 || ch>9){if(ch==-)j=-1;ch=getchar();}
11     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
12     return x*j;
13 }
14 void dfs(int i,int j,int num)
15 {
16     ans[i][j]=num;
17     if(num==n*n)
18         return;
19     if(i==1 && j!=n)
20     {
21         dfs(n,j+1,num+1);
22         return;
23     }
24     if(i!=1 && j==n)
25     {
26         dfs(i-1,1,num+1);
27         return;
28     }
29     if(i==1 && j==n)
30     {
31         dfs(i+1,j,num+1);
32         return;
33     }
34     if(i!=1 && j!=n)
35         if(!ans[i-1][j+1])
36         {
37             dfs(i-1,j+1,num+1);
38             return;
39         }
40         else
41         {
42             dfs(i+1,j,num+1);
43             return;
44         }
45 }
46 int main()
47 {
48     freopen("magic.in","r",stdin);
49     freopen("magic.out","w",stdout);
50     scanf("%d",&n);
51     dfs(1,n/2+1,1);
52     for(int i=1;i<=n;i++)
53     {
54         for(int j=1;j<=n;j++)
55             printf("%d ",ans[i][j]);
56         putchar(\n);
57     }
58     fclose(stdin);fclose(stdout);
59     return 0;
60 }
View Code

 

T2 信息传递

 

拓扑删去不在环里的点,再dfs找最小环

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 using namespace std;
 5 const int N=200001;
 6 int n,ans=0x3f3f3f,num;
 7 int son[N],in[N];
 8 bool vis[N];
 9 queue<int>q;
10 inline int qread()
11 {
12     int x=0,j=1;
13     char ch=getchar();
14     while(ch<0 || ch>9){if(ch==-)j=-1;ch=getchar();}
15     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
16     return x*j;
17 }
18 void dfs(int x)
19 {
20     num++;
21     vis[x]=1;
22     if(!vis[son[x]])
23     {
24         dfs(son[x]);
25         vis[son[x]]=1;
26     }
27 }
28 int main()
29 {
30     freopen("message.in","r",stdin);
31     freopen("message.out","w",stdout);
32     scanf("%d",&n);
33     for(int i=1;i<=n;i++)
34     {
35         son[i]=qread();
36         in[son[i]]++;
37     }
38     for(int i=1;i<=n;i++)
39         if(!in[i])
40         {
41             q.push(i);
42             vis[i]=1;
43         }
44     while(!q.empty())
45     {
46         int u=q.front();
47         q.pop();
48         in[son[u]]--;
49         if(!in[son[u]])
50         {
51             q.push(son[u]);
52             vis[son[u]]=1;
53         }
54     }
55     for(int i=1;i<=n;i++)
56     {
57         num=0;
58         if(!vis[i])
59             dfs(i);
60         if(num)ans=min(ans,num);
61     }
62     printf("%d\n",ans);
63     fclose(stdin);fclose(stdout);
64     return 0;
65 }
View Code

 

T3 斗地主

 

第一大大的模拟+搜索

技术分享
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 using namespace std;
  5 int T,n,ans;
  6 int num[20],num2[10];
  7 //num记录i大的牌的数量 
  8 //num2表示有数量为i的牌的数量 
  9 inline int qread()
 10 {
 11     int x=0,j=1;
 12     char ch=getchar();
 13     while(ch<0 || ch>9){if(ch==-)j=-1;ch=getchar();}
 14     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
 15     return x*j;
 16 }
 17 int calc()
 18 {
 19     memset(num2,0,sizeof(num2));
 20     for(int i=0;i<=13;i++)
 21         num2[num[i]]++;
 22     int tot=0;
 23     while(num2[4] && num2[2]>=2)//四带两对 
 24     {
 25         num2[4]--;
 26         num2[2]-=2;
 27         tot++;
 28     }
 29     while(num2[4] && num2[1]>=2)//四带两单 
 30     {
 31         num2[4]--;
 32         num2[1]-=2;
 33         tot++;
 34     }
 35     while(num2[4] && num2[2])//四带一对 
 36     {
 37         num2[4]--;
 38         num2[2]--;
 39         tot++;
 40     }
 41     while(num2[3] && num2[2])//三带一对 
 42     {
 43         num2[3]--;
 44         num2[2]--;
 45         tot++;
 46     }
 47     while(num2[3] && num2[1])//三带一 
 48     {
 49         num2[3]--;
 50         num2[1]--;
 51         tot++;
 52     }
 53     return tot+num2[1]+num2[2]+num2[3]+num2[4];
 54 }
 55 void dfs(int step)
 56 {
 57     if(step>=ans)return;
 58     int tmp=calc();
 59     if(step+tmp<ans)ans=step+tmp;
 60     for(int i=2;i<=13;i++)//三顺 
 61     {
 62         int j=i;
 63         while(num[j]>=3)
 64             j++;
 65         if(j-i>=2)
 66             for(int k=i+1;k<=j-1;k++)
 67             {
 68                 for(int l=i;l<=k;l++)
 69                     num[l]-=3;
 70                 dfs(step+1);
 71                 for(int l=i;l<=k;l++)
 72                     num[l]+=3;
 73             }
 74     }
 75     for(int i=2;i<=13;i++)//双顺 
 76     {
 77         int j=i;
 78         while(num[j]>=2)
 79             j++;
 80         if(j-i>=3)
 81             for(int k=i+2;k<=j-1;k++)
 82             {
 83                 for(int l=i;l<=k;l++)
 84                     num[l]-=2;
 85                 dfs(step+1);
 86                 for(int l=i;l<=k;l++)
 87                     num[l]+=2;
 88             }
 89     }
 90     for(int i=2;i<=13;i++)//单顺 
 91     {
 92         int j=i;
 93         while(num[j]>=1)
 94             j++;
 95         if(j-i>=5)
 96             for(int k=i+4;k<=j-1;k++)
 97             {
 98                 for(int l=i;l<=k;l++)
 99                     num[l]--;
100                 dfs(step+1);
101                 for(int l=i;l<=k;l++)
102                     num[l]++;
103             }
104     }
105 }
106 int main()
107 {
108     freopen("landlords.in","r",stdin);
109     freopen("landlords.out","w",stdout);
110     scanf("%d%d",&T,&n);
111     while(T--)
112     {
113         memset(num,0,sizeof(num));
114         ans=0x3f3f3f3f;
115         for(int i=1;i<=n;i++)
116         {
117             int x=qread(),y=qread();
118             if(x==1)x=13;
119             else if(x)x--;
120             num[x]++;
121         }
122         dfs(0);
123         printf("%d\n",ans);
124     }
125     fclose(stdin);fclose(stdout);
126     return 0;
127 }
View Code

 

以上是关于NOIP2015提高组的主要内容,如果未能解决你的问题,请参考以下文章

如何评价NOIP2015提高组复赛试题

如何评价NOIP2015提高组复赛试题

JZYZOJ1452 NOIP2015_提高组Day2_1_跳石头

[NOIP2015 提高组] 运输计划

如何评价NOIP2015提高组复赛试题

noip2015提高组