Problem A。 Best Matched Pair
找出最大的每一位递增1的一对乘积,$n^2$枚举
#include<bits/stdc++.h> using namespace std; int n,a[2000],ans=-1; bool ck(int a){ int b=-1; while(a){ int t=a%10;//23456 a/=10; if(b!=-1&&t!=b-1)return 0; b=t; } return 1; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(ck(a[i]*a[j])) ans=max(ans,a[i]*a[j]); printf("%d",ans); }
Problem B。 Help the Princess!
公主能否逃到出口且不被士兵们赶上。
从出口bfs,如果出口离公主比离任意一个士兵近,则可以逃出。
#include<bits/stdc++.h> #define N 205 using namespace std; int n,m; char mp[N][N]; int dx[6]={0,0,1,-1}; int dy[6]={1,-1,0,0}; int sod=-1,pri; int vis[N][N]; struct node{int x,y,d;}q[50000]; void bfs(){ int l=0,r=0; while(l<=r){ node k=q[l++]; if(mp[k.x][k.y]=='$' && sod==-1) sod=k.d; if(mp[k.x][k.y]=='@') pri=k.d; for(int i=0;i<4;i++) { node p=(node){k.x+dx[i],k.y+dy[i],k.d+1}; if(p.x>=0 && p.x<n && p.y>=0 && p.y<m){ if(mp[p.x][p.y]!='#' && !vis[p.x][p.y]) { q[++r]=p; vis[p.x][p.y]=1; } } } } } int main(){ scanf("%d%d ",&n,&m); for(int i=0;i<n;i++){ char s[1000]; cin.getline(s,1000); for(int j=0;s[j];j++){ mp[i][j]=s[j]; if(s[j]=='%')q[0]=(node){i,j,0},vis[i][j]=1; } } bfs(); if(sod!=-1 && sod<=pri)puts("No"); else puts("Yes"); }
Problem D。 Parentheses
问你需要交换t次即可匹配正确的长度最小、字典序最小的括号序列。
n对括号最多需要1+2+..+n次交换,当它是)))..(((的形式时,)))(((需要6次,然后把中间两个交换一下,))()((就还需要5次,再交换一次靠近左边的)(,变成了)())((就需要4次,而3次,只要2对括号。
t次交换,先找出需要多少对括号,然后先给它)))...(((的形式,然后交换s-(p-t)(比如5次交换,就是3-(6-5)=2)和s.
#include<bits/stdc++.h> #define N 1000000 using namespace std; int t,s,p; char a[N]; int main(){ scanf("%d",&t); for(s=1;p<t;s++)p+=s; s--; for(int i=0;i<s;i++)a[i]=')',a[i+s]='('; swap(a[s],a[t-p+s]); printf("%s",a); }