[待补完]CODE FESTIVAL 2017 Final (Parallel) A,B,C(搜索)

来源:互联网 发布:sql 选取时间段 编辑:程序博客网 时间:2024/06/10 09:49

比赛地址

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;}