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