Codeforces Round #767 (Div. 2) A ~ D
Posted Ja_King_ZH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #767 (Div. 2) A ~ D相关的知识,希望对你有一定的参考价值。
A.https://codeforces.com/contest/1629/problem/A
题意:给定n和k,以及两个数组a,b(大小为n),若k大于等于ai,则可以获得bi,问能获得的最大价值是多少。
题解,贪心,先找最小的,若大于此时最小的ai,则加上bi,在找次小的。
typedef pair<int, int>PII;
const int N = 110;
int a[N], b[N];
PII c[N];
int main()
int t;
cin >> t;
while (t--)
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> b[i];
for (int i = 1; i <= n; i++)
c[i] = a[i], b[i] ;
sort(c + 1, c + 1 + n);
for (int i = 1; i <= n; i++)
if (k >= c[i].first) k += c[i].second;
cout << k << endl;
return 0;
B.https://codeforces.com/contest/1629/problem/B
题意:给定 l 和 r ,数组为l到r直接的每一个数,如l = 1,r = 3,则数组为1 2 3,问在k次操作下,能否使得数组的最大公因数大于1。
题解:结论题,当(r - l + 1) / 2 <= k时,yes,否则no,但当l为奇数时,应为(r - l + 2) / 2,并需要特判l = r 时。
int main()
int t;
cin >> t;
while (t--)
int l, r, k, res = 0;
cin >> l >> r >> k;
res = r - l + 1;
if (l == r && l != 1)
puts("YES");
continue;
if (l % 2 == 1) res++;
if (res / 2 <= k) puts("YES");
else puts("NO");
return 0;
C.https://codeforces.com/contest/1629/problem/C
题意:定义mex为当前选定的前k个数字中最小非负整数,并将当前mex加入新数组中,删除前k个数据,直到数组为空。要求新数组字典序最大。
题解:首先找到第一个断层的数,即数组中,第一个数组没有的非负整数,然后在遍历数组,找到最小满足条件的k,并更新mex。
const int N = 2e5 + 10;
int a[N], f[N];
int main()
int t;
cin >> t;
while (t--)
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
f[a[i]]++;
vector<int>ans;
set<int>s;
int mex = 0;
for (int i = 0; i <= n;i++)
if (f[i]) s.insert(i);
else
mex = i;
if(i) ans.push_back(i);
break;
for (int i = 1; i <= n; i++)
if (s.size() == 0)
ans.push_back(mex);
for (int i = 0; i < mex;i++)s.insert(i);
f[a[i]]--;
if (s.find(a[i]) != s.end()) s.erase(a[i]);
if (f[a[i]] == 0) mex = min(mex, a[i]);
cout << ans.size() << endl;
for (int i = 0; i < ans.size();i++)cout << ans[i] << ' ';
cout << endl;
return 0;
D.https://codeforces.com/contest/1629/problem/D
题意:给定n个字符串长度小于等于3的字符串。选定部分字符串,判断能否组成回文字符串。
题解:map进行哈希即可(注意情况考虑完全!!!!!!)。
int main()
int t;
cin >> t;
map<string, int>mp;
while (t--)
int n;
cin >> n;
int f = 0;
for (int i = 0; i < n; i++)
string res;
cin >> res;
mp[res]++;
if (res.size() == 1) f = 1;
reverse(res.begin(), res.end());
if (res.size() % 2 == 1)
if (mp[res.substr(0, 2)] >= 1) f = 1;
else
for (int j = 0; j < 26; j++)
char ans = ('a' + j);
if (mp[res + ans] >= 1) f = 1;
if (mp[res] >= 1) f = 1;
if (f) cout << "YES" << endl;
else cout << "NO" << endl;
mp.clear();
return 0;
以上是关于Codeforces Round #767 (Div. 2) A ~ D的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #767 (Div. 2) A ~ D
Codeforces Round #767 (Div. 2) ABCD题解
Codeforces Round #767 (Div. 2)(A B C D E F1 F2)
Codeforces Round #436 E. Fire(背包dp+输出路径)