Codeforces Round #406 (Div. 2)

只做出了B题,尴尬...

第一题自己推规律推错了,事实证明正确解法是暴力。

好在A被hack后知道错在了哪,反hack到2个人,所以rating居然还涨了。

 

A - The Monster 【暴力】

题意:有两个人。甲在b, b+a, b+2a, b+3a....的时候叫,乙在d, d+c, d+2c, d+3c...的时候叫。问是否存在某一时刻两人同时叫,输出第一次同时叫的时间。否则输出-1。

做法:遍历甲前1000次叫的时刻,用map记录下来。然后遍历乙前1000次叫的时刻,如果该时刻甲也叫了,那就输出这个时刻,结束程序。如果一直找不到,那就是-1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
int main() {
    int a, b, c,d;
    cin >>a >>b>>c>>d;
    map<int,int>mp;
    for(int i = 0; i < 1000; i++) {
        mp[b + i * a] = 1;
    }
    for(int i = 0; i < 1000; i++) {
        if(mp[d + i * c] > 0) {
            cout << d + i * c << endl;
            return 0;
        }
    }
    puts("-1");
}

 

B - Not Afraid 【模拟】

题意: 有N个星球(1..N) 和M个组织。每个星球有两个人,忠诚者(positive)和叛徒(negative)。如果任意一个组织里存在全部人都是叛徒的可能,那么输出"YES”,否则输出“NO”

做法:对于每个组织,用set来存来自不同星球的人,如果找得到一对 a = -b(即来自同一星球的忠诚者和叛徒,那么这个组织肯定有一个忠诚者),则说明这个组织是安全的。否则输出“YES”,结束程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
const int INF = 0x3f3f3f3f;
using namespace std;
int main() {
    int n, m, x, temp;
    scanf("%d%d", &n, &m);
    set<int>st;
    for(int i = 0; i < m; i++) {
        bool flag = false;
        scanf("%d", &x);
        st.clear();
        while(x--) {
            scanf("%d", &temp);
            if(st.find(-temp) != st.end()) flag = true//只要找得到一对,那么就不危险了
            st.insert(temp);
        }
        if(flag == false) {  //如果一对都找不到,那就要终止计划,输出"YES“,结束程序
            puts("YES");
            return 0;
        }
    }
    puts("NO");
}
posted @ 2017-03-30 16:28  bestwzh  阅读(145)  评论(0编辑  收藏  举报