Problem A.(…)
#include<bits/stdc++.h>
using namespace std;
void dfs(int x,string a,string b,string c){
if(x==a.length()){
if(b==c){
puts("YES");exit(0);}
else return ;
}
if(a[x]=='A')dfs(x+1,a,b,c);
dfs(x+1,a,b,c+a[x]);
}
int main(){
string s,t="AKIHABARA";
cin>>s;
dfs(0,t,s,"");
puts("NO");
}
Problem B.(…)
#include<bits/stdc++.h>
using namespace std;
char s[100100];
int a[100];
int main(){
scanf("%s",s);
for(int i=0;s[i];i++)
a[s[i]-'a']++;
int c=min(a[0],min(a[1],a[2]));
for(int i=0;i<3;++i)
if((a[i]-=c)>=2)return puts("NO"),0;
puts("YES");
}
Problem C.
可以发现0~12的数每种只能变成d或24-d,枚举变成哪个即可,复杂度 O(212∗122)
#include<bits/stdc++.h>
using namespace std;
int n,a[20],c[100],tp,ans;
int chk(){
int ret=10007;
for(int i=0;i<=tp;++i)
for(int j=i+1;j<=tp;++j)
ret=min(ret,min(abs(c[i]-c[j]),24-abs(c[i]-c[j])));
return ret;
}
void dfs(int x){
if(x==13){
ans=max(ans,chk());
return ;
}
if(a[x]==2)c[++tp]=x,c[++tp]=24-x,dfs(x+1),tp-=2;
else if(a[x]==1)c[++tp]=x,dfs(x+1),c[tp]=24-x,dfs(x+1),tp--;
else dfs(x+1);
}
int main(){
scanf("%d",&n);
for(int i=1,x;i<=n;++i)
scanf("%d",&x),a[x]++;
for(int i=0;i<=12;++i)
if(a[i]>2)return puts("0"),0;
dfs(0);
printf("%d",ans);
}
Problem D.
可以证明,被选的人的 Hi+Pi 一定是递增的。
证明如下:假设有两个人 a,b ,那么a在b前面的条件就是 min(Ha,Hb−Pa)≥min(Hb,Ha−Pb) ,即 Ha+Pa≤Hb+Pb
于是可以拿一个 dp(i,j) 表示前 i 个人已经选了