只做出了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");} |