Codeforces Round #811 (Div. 3)
A. Everyone Loves to Sleep
思路
把所有闹钟以及他睡觉的时间全部化成分钟然后排序,取睡觉时间的后一个作差,如果睡觉时间是最后一个就取序列中首位+24作差.
代码
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" const int N = 3e3 + 7, INF = 1e9; int n, m; int s[N]; void solve() { int n, t1, t2; cin >> n >> t1 >> t2; for (int i = 1; i <= n; i++) { int a, b; cin >> a >> b; s[i] = a * 60 + b; } sort(s + 1, s + 1 + n); int x = t1 * 60 + t2; for (int i = 1; i <= n; i++) { if (s[i] >= x) { x = s[i] - x; cout << x / 60 << " " << x % 60 << endl; return; } } x = 24 * 60 - x + s[1]; cout << x / 60 << " " << x % 60 << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); }
B. Remove Prefix
思路
从后往前搜索,遇到第一个重复的数就从此位置向前全部删除。
代码
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" const int N = 1e6 + 7, INF = 1e9; int s[N]; void solve() { int n; cin >> n; map<int, int> ma; for (int i = 1; i <= n; i++) cin >> s[i]; for (int i = n; i >= 1; i--) { if (ma[s[i]] == 1) { cout << i << endl; return; } ma[s[i]]++; } cout << "0\n"; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); }
C. Minimum Varied Number
思路
按要求构造即可
代码
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" const int N = 1e6 + 7, INF = 1e9; char s[N]; void solve() { int a; cin >> a; vector<int> q; for (int i = 9; i >= 1; i--) { if (a >= i) { q.push_back(i); a -= i; } if (a == 0) break; } for(int i=q.size()-1;i>=0;i--) cout<<q[i]; cout << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); }
D - Color with Occurrences
思路
用每一个子串过一遍主串,记录每个位置最多可以先后染色的位数。
然后从第一个开始,取范围内最长的一个位置向后重复操作。
代码
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" const int N = 1e2 + 7, INF = 1e9; int s[N]; int dis[N], vis[N]; void solve() { memset(dis, 0, sizeof(dis)); memset(vis, 0, sizeof(vis)); string s; cin >> s; int m = s.size(); s = " " + s; int n; cin >> n; for (int i = 1; i <= n; i++) { string ca; cin >> ca; int cn = ca.size(); ca = " " + ca; for (int k = 1; k <= m; k++) { int flag = 1; for (int j = 1; j <= cn; j++) { if (s[k + j - 1] != ca[j]) { flag = 0; break; } } if (flag == 1) { if (dis[k] < cn) { dis[k] = cn; vis[k] = i; } } } } vector<pair<int, int>> q; int l = 1, r = dis[1] + 1; q.push_back({vis[1], 1}); int flag = 0; while (1) { if (r > m) { flag = 1; break; } int mx = l; for (int i = l; i <= r; i++) { if (dis[i] + i > dis[mx] + mx) mx = i; } if (mx == l) break; q.push_back({vis[mx], mx}); l = mx, r = dis[mx] + mx; } if (flag != 1) { cout << "-1\n"; return; } cout << q.size() << endl; for (auto x : q) cout << x.first << " " << x.second << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); }
E - Add Modulo 10
思路
首先把奇数先操作一次变成偶数,然后就个位只可能是0,2,4,6,8 末尾是0的怎么操作都不会再改变了,单独分为一类.
剩下的数个位总是以2,4,8,6,2,4,8,6循环出现,每循环一次会增加20,可以把每个数都变成以2为结尾,
判断任意两个数的差值是否为20的倍数。
代码
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" const int N = 1e6 + 7, INF = 1e9; int s[N]; void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; if (s[i] % 10 == 5) { s[i] += 5; continue; } if (s[i] % 10 == 0) continue; while (s[i] % 10 != 2) s[i] += s[i] % 10; } sort(s + 1, s + 1 + n); if (s[1] % 10 == 0) { if (s[1] == s[n]) cout << "YES\n"; else cout << "NO\n"; return; } for (int i = 1; i < n; i++) { if (s[i] == s[i + 1]) continue; int x = abs(s[i] - s[i + 1]); if (x % 20 != 0) { cout << "NO\n"; return; } } cout << "YES\n"; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); }