第二届太原理工大学程序设计新生赛决赛(重现赛)
A | Reversi |
翻转棋,如果两边棋子都是白色,黑子无论动或者不动,下一场白子将全部翻成白。而如果有一个边是黑子,黑子一次就可以全翻黑。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const ll inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n; 26 char s[10*N]; 27 int main() 28 { 29 scanf("%d",&n); 30 scanf("%s",s+1); 31 if(s[1]=='1'||s[n]=='1') 32 puts("Qiy win"); 33 else puts("Vanis win"); 34 35 36 return 0; 37 }
C | Nitori and Stack-Tech |
模拟栈
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const ll inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n,len=0; 26 char s[30],t[30],st[30]; 27 int main() 28 { 29 scanf("%d",&n); 30 scanf("%s%s",s+1,t+1); 31 int c1=0,c2=1; 32 for(int i=1;i<=n;i++) 33 { 34 while(len>0&&st[len]==t[c2]) 35 { 36 len--; 37 c2++; 38 } 39 st[++len]=s[i]; 40 } 41 while(len>0&&st[len]==t[c2]) 42 { 43 len--; 44 c2++; 45 } 46 if(len==0&&c2==n+1) 47 puts("Yes"); 48 else puts("No"); 49 50 51 return 0; 52 }
D | Triangle |
递归一下,然后把所有没有赋值的赋值为.
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const int inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n; 26 char s[3100][2100]; 27 void put(int h,int w) 28 { 29 int cnt=w; 30 for(int i=h;i>=1;i--) 31 { 32 for(int j=cnt;j>=1;j--) 33 if(!s[i][j]) 34 s[i][j]='.'; 35 cnt--; 36 } 37 for(int i=1;i<=h;i++) 38 { 39 cnt++; 40 for(int j=1;j<=cnt;j++) 41 printf("%c",s[i][j]); 42 printf("\n"); 43 } 44 } 45 void print(int x,int y) 46 { 47 s[x][y]='/'; 48 s[x][y+1]=s[x][y+2]='_'; 49 s[x][y+3]=92; 50 s[x-1][y+1]='/'; 51 s[x-1][y+2]=92; 52 } 53 void solve(int n,int x,int y) 54 { 55 if(n==1) 56 { 57 print(x,y); 58 return; 59 } 60 int cnt=1<<(n-1); 61 int k=1<<n; 62 //cout<<n<<" "<<cnt<<" "<<k<<endl; 63 solve(n-1,x,y); 64 solve(n-1,x,y+k); 65 solve(n-1,x-cnt,y+cnt); 66 } 67 int main() 68 { 69 scanf("%d",&n); 70 int h=1<<n,w=1<<(n+1); 71 //cout<<h<<" "<<w<<endl; 72 solve(n,h,1); 73 put(h,w); 74 75 76 return 0; 77 }
E | Sweet |
有糖,感觉是一个exgcd的题。不知道为啥没人这样写...
找到第一个有糖的人,然后剩下的就是每隔lcm就是一个有糖的人。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const int inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 ll n,a,b,gcdd,x,y; 26 ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);} 27 ll lcm(ll a,ll b) {return a/gcd(a,b)*b;} 28 int main() 29 { 30 scanf("%lld%lld%lld",&n,&a,&b); 31 ll lc=lcm(a,b); 32 ll st=n+1; 33 for(ll i=n%b+1;i<=n;i+=b) 34 { 35 if(i%a==0) 36 { 37 st=i; break; 38 } 39 } 40 if(st>n) {printf("0\n"); return 0;} 41 ll ans=(n-st)/lc+1; 42 printf("%lld\n",ans); 43 44 45 46 return 0; 47 }
G | Gangstar |
在一棵树上,1号点上的人在追赶x号点的人。
对于一个节点来说,如果1号点到达这个节点的时间>x号点到达这个节点的时间,x就可以到达这个节点的最深处,等待着1号点的抓捕。
重点是怎么求时间,也就是距离。用到了lca。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const int inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n,xx,yy,st; 26 int Link[2*N],len=0; 27 int f[2*N][22],dep[2*N],dp[2*N]; 28 int ans=0; 29 struct node 30 { 31 int y,next; 32 }e[4*N]; 33 void insert(int xx,int yy) 34 { 35 e[++len].next=Link[xx]; 36 Link[xx]=len; 37 e[len].y=yy; 38 } 39 void dfs(int x,int fa) 40 { 41 dep[x]=dep[fa]+1; 42 for(int i=1;(1<<i)<=dep[x];i++) 43 f[x][i]=f[f[x][i-1]][i-1]; 44 for(int i=Link[x];i;i=e[i].next) 45 { 46 int v=e[i].y; 47 if(v==fa) continue; 48 f[v][0]=x; 49 dfs(v,x); 50 dp[x]=max(dp[x],dp[v]+1); 51 } 52 } 53 int lca(int x,int y) 54 { 55 if(dep[x]<dep[y]) swap(x,y); 56 for(int i=20;i>=0;i--) 57 { 58 if(dep[f[x][i]]>=dep[y]) x=f[x][i]; 59 if(x==y) return x; 60 } 61 for(int i=20;i>=0;i--) 62 { 63 if(f[x][i]!=f[y][i]) 64 { 65 x=f[x][i]; 66 y=f[y][i]; 67 } 68 } 69 return f[x][0]; 70 } 71 int dis(int x,int y) 72 { 73 return dep[x]+dep[y]-2*dep[lca(x,y)]; 74 } 75 void dfs1(int u,int fa) 76 { 77 int dis1=dis(u,1),dis2=dis(u,st); 78 if(dis1>dis2) 79 { 80 int ma=2*dp[u]+2*dis1; 81 ans=max(ans,ma); 82 } 83 for(int i=Link[u];i;i=e[i].next) 84 { 85 int v=e[i].y; 86 if(v==fa) continue; 87 dfs1(v,u); 88 } 89 } 90 int main() 91 { 92 scanf("%d%d",&n,&st); 93 for(int i=1;i<n;i++) 94 { 95 scanf("%d%d",&xx,&yy); 96 insert(xx,yy); 97 insert(yy,xx); 98 } 99 dfs(1,0); 100 dfs1(1,0); 101 printf("%d\n",ans); 102 103 return 0; 104 }
H | Stable Fusion |
1号节点是根,刚开始觉得1号节点可以随便设置,然后它下面的节点都必须满足 min(a[i],a[fa]);
然后就过不去了。
1号节点可以随便设置,1号节点下面的节点,只要不超过1号节点的值,也可以随便设置。而不是非要用ai这个值。
然后就是dp了。
我们把下面的节点所有都求出来。
f[fa][j]+=f[v][j];
最后求最小的f[1][x]就好了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const int inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n,xx,yy; 26 int Link[1010],len=0; 27 int ans=0; 28 ll a[1010],f[1010][1010]; 29 struct node 30 { 31 int y,next; 32 }e[2020]; 33 void insert(int xx,int yy) 34 { 35 e[++len].next=Link[xx]; 36 Link[xx]=len; 37 e[len].y=yy; 38 } 39 void dfs(int x,int fa) 40 { 41 for(int j=0;j<=1000;j++) f[x][j]=abs(a[x]-j); 42 for(int i=Link[x];i;i=e[i].next) 43 { 44 int v=e[i].y; 45 if(v==fa) continue; 46 dfs(v,x); 47 ll minn=inf; 48 for(int j=0;j<=1000;j++) 49 { 50 minn=min(minn,f[v][j]); 51 f[x][j]+=minn; 52 } 53 } 54 } 55 int main() 56 { 57 scanf("%d",&n); 58 for(int i=2;i<=n;i++) 59 { 60 scanf("%d",&xx); 61 insert(i,xx); 62 insert(xx,i); 63 } 64 for(int i=1;i<=n;i++) 65 { 66 scanf("%lld",&a[i]); 67 } 68 for(int i=1;i<=n;i++) 69 for(int j=0;j<=1000;j++) 70 f[i][j]=inf; 71 dfs(1,0); 72 ll ans=inf; 73 for(int i=0;i<=1000;i++) 74 ans=min(ans,f[1][i]); 75 printf("%lld\n",ans); 76 77 78 return 0; 79 }
I | The Flower of Hope |
满足条件的区间为:区间和k%m<k/2
当k>=m,就可以达到这个条件。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const int inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n,m; 26 int a[N]; 27 ll sum[N]; 28 ll ans=0; 29 int check(int x,int k) 30 { 31 if(sum[x]-sum[k-1]>=m) return 1; 32 return 0; 33 } 34 int main() 35 { 36 scanf("%d%d",&n,&m); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%d",&a[i]); 40 sum[i]=sum[i-1]+a[i]; 41 } 42 for(int i=1;i<=n;i++) 43 { 44 int l=i,r=n; 45 while(l<=r) 46 { 47 int mid=l+r>>1; 48 if(check(mid,i)) r=mid-1; 49 else l=mid+1; 50 } 51 ans+=n-l+1; 52 } 53 printf("%lld\n",ans); 54 55 return 0; 56 }
J | Fuse the Cube Fragment |
找最多的不能整除的数。
答案为 n/2,从n/2开始,一直到n。
要找两种就是 把所有偶数都除/2,也算一种。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const ll inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n; 26 int prime[N],p[N],tot; 27 void init(int n) 28 { 29 for(int i=2;i<=n;i++) prime[i]=1; 30 for(int i=2;i<=n;i++) 31 { 32 if(prime[i]==1) p[++tot]=i; 33 for(int j=1;j<=tot&&i*p[j]<=n;j++) 34 { 35 prime[i*p[j]]=0; 36 if(i%p[j]==0) break; 37 } 38 } 39 } 40 int main() 41 { 42 scanf("%d",&n); 43 for(int i=n/2+1;i<=n;i++) 44 { 45 printf("%d",i); 46 if(i==n) printf("\n"); 47 else printf(" "); 48 } 49 for(int i=n/2+1;i<=n;i++) 50 { 51 if(i%2==0) printf("%d",i/2); 52 else printf("%d",i); 53 if(i==n) printf("\n"); 54 else printf(" "); 55 } 56 57 58 59 return 0; 60 }
L | The Scarborough Fair |
换硬币,a不够用的时候,从c换a,再从b换c换
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const ll inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int n,a,b,c; 26 int w1,w2,w3; 27 int x,y; 28 int check(int &aa,int &bb,int &cc,int kk) 29 { 30 if(aa>=kk){aa-=kk; return 1;} 31 kk-=aa; aa=0; 32 if(cc/2>=kk) {cc-=kk*2; return 1;} 33 kk-=cc/2; cc=cc%2; 34 bb+=cc%2*2; 35 if(bb/4>=kk) {bb-=kk*4; cc=0; return 1;} 36 37 return 0; 38 } 39 int main() 40 { 41 scanf("%d%d%d%d",&n,&a,&b,&c); 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%d%d",&x,&y); 45 if(x==1) w1+=y; 46 else if(x==2) w2+=y; 47 else w3+=y; 48 } 49 int ff=0; 50 if(check(a,b,c,w1)==1) 51 { 52 if(check(b,c,a,w2)==1) 53 { 54 if(check(c,a,b,w3)==1) 55 { 56 ff=1; 57 } 58 } 59 } 60 if(ff) puts("YES"); 61 else puts("NO"); 62 63 64 return 0; 65 }
M |
Cappuccino ~ the end of journey |
倒几杯卡布奇诺。
dp一下就可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 #include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const ll inf = 0x3f3f3f3f; 23 const ll mod=1e9+7; 24 const int N=100000+50; 25 int a,b,c,d; 26 int f[210]; 27 int main() 28 { 29 scanf("%d%d%d%d",&a,&b,&c,&d); 30 f[a]=1; 31 f[b]=c; 32 for(int i=1;i<=d;i++) 33 if(f[i]) 34 { 35 f[i+a]=max(f[i+a],f[i]+1); 36 f[i+b]=max(f[i+b],f[i]+c); 37 } 38 int ans=0; 39 for(int i=1;i<=d;i++) 40 ans=max(ans,f[i]); 41 printf("%d\n",ans); 42 43 return 0; 44 }
No matter how you feel, get up , dress up , show up ,and never give up.