[NOIP2011TG] Day 1 Solution

T1:由n至1判断是否cover到即可。

Code:

复制代码
 1 #include<cstdio> 
 2 #define MN 10005 
 3 using namespace std; 
 4 int n,x,y,a[MN],b[MN],g[MN],k[MN]; 
 5 int main() 
 6 { 
 7     scanf("%d",&n); 
 8     for (int i=1;i<=n;i++) 
 9     scanf("%d%d%d%d",&a[i],&b[i],&g[i],&k[i]); 
10     scanf("%d%d",&x,&y); 
11     for (int i=n;i>=1;i--){ 
12         if (x>=a[i]&&x<=a[i]+g[i]&&y>=b[i]&&y<=b[i]+k[i]) 
13         {printf("%d",i);return 0;} 
14     } printf("-1");return 0; 
15 }
复制代码

T2:

t[c]表示颜色为c的酒店有几间,cnt[c]表示当前可去的颜色为c的酒店有几间。

读入每间酒店的色调和咖啡店的最低消费同时,若l<=p,则以前相同色调的酒店都可以住,更新cnt,答案加上cnt[c].

Code:

复制代码
 1 #include<iostream>  
 2 #include<cmath>  
 3 #include<cstdio>  
 4 #include<cstdlib>  
 5 #include<cstring>  
 6 #include<queue>  
 7 #include<algorithm> 
 8 using namespace std; 
 9 int n,k,p,c,l,ans; 
10 int cnt[52],t[52]; 
11 int main() 
12 { 
13     scanf("%d%d%d",&n,&k,&p); 
14     for (int i=1;i<=n;i++){ 
15         scanf("%d%d",&c,&l); 
16         if (l<=p)memcpy(cnt,t,sizeof(t)); 
17         ans+=cnt[c]; 
18         if (l<=p) cnt[c]++;t[c]++; 
19     } 
20     printf("%d",ans);return 0; 
21 }
复制代码

T3:

dfs枚举交换的位置,并模拟消除与掉落的过程(可能有多次),将空白当作颜色0处理。

剪枝1:若某颜色方块少于三个,return;

剪枝2:不必分1或-1的情况分别讨论,因为若两个不为0的色块位置互换,可看成是左面色块右移1得到的(1的优先级大于-1)。若左边色块为0,则为-1,右边的色块为0,则为1.

Code:

复制代码
 1 #include<cstdio> 
 2 #include<cstring> 
 3 #include<algorithm> 
 4 using namespace std; 
 5 int x[6],y[6],dir[6],ct[11]; 
 6 int map[6][8],mcol,n,t,cnt=0; 
 7 bool check() 
 8 { 
 9     for (int i=1;i<=5;i++) 
10     for (int j=1;j<=7;j++) if (map[i][j]) return 0; 
11     return 1; 
12 } 
13 void print() 
14 { 
15     for (int i=1;i<=n;i++) printf("%d %d %d\n",x[i]-1,y[i]-1,dir[i]);exit(0); 
16 } 
17 void down() 
18 { 
19     for (int i=1;i<=5;i++){ 
20         int pos=0; 
21         for (int j=1;j<=7;j++) 
22         if (map[i][j]){ 
23             int temp=map[i][j]; 
24             map[i][j]=0;map[i][++pos]=temp;  
25         } 
26     } 
27 } 
28 bool cancel() 
29 { 
30     bool used[6][8]={0},changed=0; 
31     for (int i=1;i<=5;i++) 
32     for (int j=1;j<=7;j++){ 
33         if (!map[i][j]) continue; 
34         if (i<=3&&map[i][j]==map[i+1][j]&&map[i][j]==map[i+2][j]) 
35         {used[i][j]=used[i+1][j]=used[i+2][j]=1;changed=1;} 
36         if (j<=5&&map[i][j]==map[i][j+1]&&map[i][j]==map[i][j+2]) 
37         {used[i][j]=used[i][j+1]=used[i][j+2]=1;changed=1;} 
38     } 
39     for (int i=1;i<=5;i++) 
40     for (int j=1;j<=7;j++) if (used[i][j]) map[i][j]=0;   
41     return changed; 
42 } 
43 void dfs(int step) 
44 { 
45     int tmap[6][8]; 
46     if (step>n) {if (check()) print();else return;} 
47     for (int i=1;i<=5;i++) 
48     for (int j=1;j<=7;j++) ct[map[i][j]]++; 
49     for (int i=1;i<=mcol;i++) if(ct[i]==1||ct[i]==2) return; 
50     memcpy(tmap,map,sizeof(map)); 
51     for (int i=1;i<5;i++) 
52     for (int j=1;j<=7;j++) 
53     { 
54         if (map[i][j]!=map[i+1][j]){ 
55             if (!map[i][j]) { 
56                 x[step]=i+1;y[step]=j;dir[step]=-1; 
57             }else{ 
58                 x[step]=i;y[step]=j;dir[step]=1; 
59             } 
60             swap(map[i][j],map[i+1][j]); 
61             down();while(cancel())down();dfs(step+1); 
62             memcpy(map,tmap,sizeof(map)); 
63         } 
64     } 
65 } 
66 int main() 
67 { 
68     scanf("%d",&n);memset(map,0,sizeof(map)); 
69     for (int i=1;i<=5;i++) 
70     { 
71         int tmp=0;scanf("%d",&t);mcol=t; 
72         while(t){map[i][++tmp]=t;scanf("%d",&t);mcol=max(t,mcol);} 
73     } 
74     dfs(1);printf("-1"); 
75     return 0; 
76 } 
复制代码

 

 

 
posted on   whz2002  阅读(168)  评论(0编辑  收藏  举报
努力加载评论中...

点击右上角即可分享
微信分享提示