A. A Hard Problem
找规律即可。
#include <bits/stdc++.h> #define ll long long using namespace std; int main() { int t; scanf("%d",&t); while(t--) { ll n; scanf("%lld",&n); if(n==2) printf("2 "); else { if(n%2==0) printf("%lld ",(n/2-1)+2); else printf("%lld ",n/2+2); } } return 0; }
H. Prince and Princess
假设c全为反对者,那么反对者一共有b+c。个人理解是,对于可询问的三个问题,只向对方询问“公主在哪个房间”这个问题。在支持者比反对者多的情况下,得到的正确回答一定比错误回答要多(支持者一定回答的是正确的,可以假设反对者都说出同一个错误的房间),那么只需要询问2*(b+c)+1次问题即可。但是当出现1 0 0这组特例的时候,支持者就是公主本人,所以输出0。
#include <bits/stdc++.h> using namespace std; int main() { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a>b+c) { printf("YES "); if(a==1) printf("0 "); else printf("%d ",(b+c)<<1 | 1); } else printf("NO "); return 0; }
C. Digital Path
用a,b,c,d分别记录该位置往下还可以走0个点,1个点,2个点,大于等于3个点的数量。将可以往下走0个点的位置的a值赋值位0,并对每一个位置进行dfs,即处理完所有可行的路径,最终递归将该位置的b,c,d值更新取模。在最终计算可行的路径之前,要判断出该位置是否是最大路径的起点,如果该位置可以被上下左右的任意位置走到,则肯定不是最大路径。
#include <bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e9+7; int n,m,k[5][5]={{-1,0},{0,-1},{1,0},{0,1}}; struct node { int num; ll a,b,c,d; bool flag; }p[1005][1005]; bool checkpoint(int x,int y) { if(x<=0 || x>n || y<=0 || y>m) return false; return true; } bool check1(int i,int j) { if(i-1>0 && p[i-1][j].num-p[i][j].num==1) return true; if(i+1<=n && p[i+1][j].num-p[i][j].num==1) return true; if(j-1>0 && p[i][j-1].num-p[i][j].num==1) return true; if(j+1<=m && p[i][j+1].num-p[i][j].num==1) return true; return false; } bool check2(int i,int j) { if(i-1>0 && p[i][j].num-p[i-1][j].num==1) return false; if(i+1<=n && p[i][j].num-p[i+1][j].num==1) return false; if(j-1>0 && p[i][j].num-p[i][j-1].num==1) return false; if(j+1<=m && p[i][j].num-p[i][j+1].num==1) return false; return true; } node dfs(int i,int j) { if(p[i][j].flag) return p[i][j]; p[i][j].flag=true; for(int t=0;t<4;t++) { int nx=i+k[t][0],ny=j+k[t][1]; if(checkpoint(nx,ny) && p[nx][ny].num-p[i][j].num==1) { node next=dfs(nx,ny); p[i][j].b=(p[i][j].b+next.a)%mod; p[i][j].c=(p[i][j].c+next.b)%mod; p[i][j].d=(p[i][j].d+next.c+next.d)%mod; } } return p[i][j]; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&p[i][j].num); p[i][j].flag=false; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(check1(i,j)) p[i][j].a=0; else p[i][j].a=1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dfs(i,j); } } ll ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(check2(i,j)) ans=(ans+p[i][j].d)%mod; } } printf("%lld ",ans); return 0; }