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

比赛地址

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值