Problem A。 Best Matched Pair
找出最大的每一位递增1的一对乘积,n^2枚举
代码语言:javascript复制#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;//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,如果出口离公主比离任意一个士兵近,则可以逃出。
代码语言:javascript复制#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.
代码语言:javascript复制#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);
}