Codeforces Round #438 868A/B/C


A.Bark to Unlock

time limit per test: 2 seconds

题意:

先给出一个长度是2的字符串作为密码,在给出n个长度是2字符串,判断这些字符串的组合可不可以组成密码。

思路:

先处理给出的字符串中是否含有密码,然后两个两个的判断。注意每个字符串可以多次利用。

#include "bits/stdc++.h"
using namespace std;
const int maxn = 120;
char s[maxn][3];
int main(int argc, char const *argv[])
{
    scanf("%s", s[0]);
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n ;i++) {
        scanf("%s", s[i]);
    }
    bool flag = false;
    for (int i = 1; i <= n; i++) {
        if (strcmp(s[0], s[i]) == 0) flag = true;
        for (int j = 1; j <= n; j++) {
            if (flag) break;
            if (s[0][0] == s[i][1] && s[0][1] == s[j][0]) flag = true;
        }
        if (flag) break;
    }
    printf("%s\n", flag?"YES": "NO");
    return 0;
}

B.Race Against Time

time limit per test: 2 seconds

题意:

给出现在钟表的时刻,判断从t1到t2是否可以不夸过指针。

思路:

判断每个指针是否在都在t1和t2的同一夹角里。

#include "bits/stdc++.h"
using namespace std;
const double pc = 1e-3;
double arct2, arct1, t;
bool judge(double h, double m, double s) {
    bool flag1 = true, flag2 = true;
    if (h>arct1&&h<arct2||m>arct1&&m<arct2||s>=arct1&&s<=arct2) flag1 = false;
    if (h<arct1&&h>0||m<arct1&&m>0||s<arct1&&s>=0) flag2 = false;
    if (h>arct2&&h<360||m>arct2&&m<360||s>arct2&&s<=360) flag2 = false;
    // printf("%d %d\n", flag1, flag2);
    return flag1||flag2;
}
int main(int argc, char const *argv[])
{
    int h, m, s, t1, t2;
    scanf("%d%d%d%d%d", &h, &m, &s, &t1, &t2);
    if (h == 12) h = 0;
    arct1 = t1*360/12;
    arct2 = t2*360/12;
    double arcs = s*360/60;
    double arcm = ((double)m + (double)s/60)*360.0/60;
    double arch = ((double)h + (double)s/60)*360.0/12;
    if (arct1 > arct2) { t = arct1; arct1 = arct2; arct2 = t;}
    if (judge(arch, arcm, arcs)) printf("YES\n");
    else printf("NO\n");
    return 0;
}

C.Qualification Rounds

time limit per test: 2 seconds

题意:

Snark and Philip 要出一套题,但是每个队伍都会都做过这些题里的某些题,为了让比赛更有意思,他们要找出题,使得每个队至少有一半的题没有做过。给出n个题,k个队伍,一个矩阵表示每个队伍对每道题的状态。

思路:

其实只要考虑找到两道题,使得每个队做过1个或者没有做过。把每个题的状态进行状压,然后枚举其中的一道题,二分判断是否有另一种可行的状态。

#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e5 + 10;
bool flag;
int N, K;
int r[maxn];
void judge(int x) {
    int ans = 0;
    int ub = N, lb = 0;
    while (ub >= lb) {
        int mid = (ub + lb)/2;
        if (r[mid] >= x) {
            ans = mid;
            ub = mid - 1;
        }   
        else lb = mid + 1;
    }
    if (r[ans] == x)  flag = true;
}
void dfs(int x, int t) {
    if (t == K) {judge(x);}
    else {
        if ((x>>t)&1)  dfs(x^(1<<t), t+1);
        else {
            dfs(x, t+1); dfs(x^(1<<t), t+1);
        }
    }
}
int main(int argc, char const *argv[])
{
    scanf("%d%d", &N, &K);
    flag = false;
    for (int i = 0; i < N; i++) {
        int res = 0;
        for (int j = 0; j < K; j++) {
            int a; scanf("%d", &a);
            if (a == 1) res += 1<<j;
        }
        if (res == 0) flag = true;
        r[i] = res;
    }
    sort(r, r + N);
    for (int i = 0; i < N; i++) dfs(r[i], 0);
    printf("%s\n", flag?"YES": "NO");
    return 0;
}

D题读了读题,然后跑路去刷数分了,以后再补题。。。。。( •̀ ω •́ )✧

posted @ 2017-10-05 19:45  zprhhs  阅读(260)  评论(0编辑  收藏  举报
Power by awescnb