[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 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步