比赛地址
A - AKIBA
xjb写
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
using namespace std;
char in[100];
int main(){
int i,j;
char rigi[100] = "AKIHABARA";
while(~scanf("%s",in)){
int len = strlen(in);
int p = 0;
bool flag = true;
for(i=0;i<len;i++){
while(rigi[p] =='A' && rigi[p]!=in[i]){
p++;
}
if(rigi[p] != in[i]){
flag = false;
break;
}
p++;
}
if(p!=8 && p!=9){
flag = false;
}
if(flag){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
B - Palindrome-phobia
xjb写
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 1e5+10;
char in[maxn];
int cnt[5];
int main(){
int i,j,len;
while(~scanf("%s",in)){
len = strlen(in);
memset(cnt, 0, sizeof(cnt));
for(i=0;i<len;i++){
++cnt[in[i] - 'a'];
}
int a3 = cnt[0];
int b3 = cnt[1];
int c3 = cnt[2];
int cut = min(a3, min(b3,c3));
bool flag = true;
for(i=0;i<3;i++){
cnt[i] -= cut;
if(cnt[i] > 1){
flag = false;
break;
}
}
if(flag){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
C - Time Gap
主人公高桥君(以下简称总嘟嘟),她所在的地方此时为0点。有n个人在不同的地方,每个地方的时间都不一样,每个人的时间表示为di(0<=di<=12)表示总嘟嘟和第i个人的时差。
每个人的时间既可以写成d,也可以写成24-d(如4可以表示为20,但0和12就是自身)。现在定义一个s,s表示n+1个人中任意两个人之间的时差的最小值。我们的任务是确定di的表示(究竟表示为di还是24-di),然后使s值最大。
官方题解讲的很不错,还画了图。
一开始会想到每个人都两种表示法表示一下,算s的最大值。然而肯定会超时,本题di的范围输入使0~12,因此可以看每一个时间点:
1、如果有一个人时间是该时间点,那么搜索这个人不变和变成24-di
2、如果有两个人时间是该时间点,那么肯定是一个人时间不变,一个人变为24-di
3、如果有三人及以上的时间是该时间点,那么答案显然是0
搜搜搜。。。。我搜索写的好垃圾。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 100;
const int inf = 0x3f3f3f3f;
int save[maxn];
int ji[maxn], ou[maxn];
int myClock[maxn];
int res;
void dfs(int index, bool check){
if(index > 12){
return;
}
if(check){
int i;
int sum = 1;
int nowMin = inf;
for(i=0;i<24;i++){
if(myClock[i] == 1 && i!=0){
nowMin = min(sum, nowMin);
sum = 1;
}else if(myClock[i] == 0){
++sum;
}else if(myClock[i] > 1){
nowMin = 0;
sum = 1;
}
}
nowMin = min(sum, nowMin);
res = max(res, nowMin);
}
if(myClock[index] == 1){
dfs(index+1, true);
++myClock[24-index];
--myClock[index];
dfs(index+1,true);
++myClock[index];
--myClock[24 - index];
}else if(myClock[index] == 2){
++myClock[24-index];
--myClock[index];
dfs(index+1,true);
--myClock[24-index];
++myClock[index];
}else if(myClock[index] >2){
res = max(res, 0);
}else{
dfs(index+1,false);
}
}
int main(){
int n,i;
while(~scanf("%d",&n)){
memset(myClock, 0, sizeof(myClock));
for(i=1;i<=n;i++){
scanf("%d",&save[i]);
++myClock[save[i]];
}
myClock[0] += 1;
res = 0;
dfs(1,false);
printf("%d\n",res);
}
return 0;
}