Educational Codeforces Round 123 (Rated for Div. 2)
A. Doors and Keys
思路:判断三把钥匙是否有一把在对应的门之后才出现,有就是NO,没有就是YES
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 1010; int a[N], b[N]; int main() { int T; cin >> T; while(T -- ) { string s; cin >> s; int r = 0, g = 0, b = 0; bool flag = true; for (int i = 0; i < 6; i ++ ) { if(s[i] == 'R' && r == 0 || s[i] == 'G' && g == 0 || s[i] == 'B' && b == 0) { flag = false; break; } if(s[i] == 'r') r++; if(s[i] == 'g') g++; if(s[i] == 'b') b++; } if(flag) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
B. Anti-Fibonacci Permutation
思路:根据样例分析,构造是从2开始,依次输出到n,然后再从前往后输出剩下的数,最后输出1。一种特殊情况是,先输出1和n,然后依次输出剩下的数
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 1010; int a[N], b[N]; int main() { int T; cin >> T; while(T -- ) { int n; cin >> n; for (int i = 2; i <= n; i ++ ) { for (int j = i; j <= n; j ++ ) cout << j << ' '; for (int j = 2; j <= i - 1; j ++ ) cout << j << ' '; cout << 1 << endl; } cout << 1 << ' ' << n << ' '; for (int i = 2; i <= n - 1; i ++ ) cout << i << ' '; cout << endl; } return 0; }
C. Increase Subarray Sums
思路:遍历kk.然后循环访问将具有最大总和的段。让它的长度ll.因为xx是非负的,增加段内的元素始终是最佳的。因此,如果k≤lk≤l,则段的总和增加k⋅xk⋅x.否则,只有段内的元素会影响总和,因此,它将增加l⋅xl⋅x.这可以写成min(k,l)⋅xmin(k,l)⋅x.
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 1010; int a[N], b[N]; int main() { int T; cin >> T; while(T -- ) { int n; LL x; cin >> n >> x; LL a[n + 1] = {}, mx[n + 1] = {}, sum, ans; for (int i = 1; i <= n; i++) { cin >> a[i]; mx[i] = -0x3f3f3f3f; } for (int i = 1; i <= n; i++) { sum = 0; for (int j = i; j <= n; j++) { sum += a[j]; mx[j - i + 1] = max(mx[j - i + 1], sum); } } for (int k = 0; k <= n; k++) { ans = 0; for (int i = 1; i <= n; i++) { ans = max(ans, mx[i] + min(k, i) * x); } cout << ans << " "; } cout << endl; } return 0; }

浙公网安备 33010602011771号