字数统计:
885字
|
阅读时长:
4分
A题
题意:输入两组数,为1表示有该任务,0表示没有,现在由你定义每个任务的分数,使得最高分最小的情况下,第一个人的总分大于第二个人,如果无法满足,输出-1。
思路:这道题的话,先处理两个人的特有任务,如果第一个人特有的任务第二个人都有,那么一定无法满足,因为两个人任务的分数是相同的,第二个人特有的任务按照题目要求,应当为1分,第一个人的特有任务,按照第二个人特有任务的数量,平均分配即可。
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <bits/stdc++.h> typedef long long ll; const int maxx = 100010; const int inf = 0x3f3f3f3f; using namespace std; int a[maxx]; int b[maxx]; int main() { int n; while (cin >> n) { for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; int ans1 = 0, ans2 = 0; for (int i = 1; i <= n; i++) { if (a[i] + b[i] == 1) { ans1 += a[i]; ans2 += b[i]; } } if (ans1 == 0) cout << "-1" << endl; else cout << (ans1 + ans2) / ans1 << endl; } return 0; }
|
B题
题意 :有n个数,对于Ai和Aj这两个数,如果满足Ai-Aj=i-j,那么两个数就可以求和,输出整个数组能够求和的最大值。
思路:这道题的话,因为每个城市有beauty值b,可以相互连通的城市i和j之间 i-j==b[i]-b[j],所以i-b[i]==j-b[j],所以可以连通的所有城市i-b[i]都是相等的,所以我们记录可以给到每一个差值的beauty值之和再取max就可以了。
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <bits/stdc++.h> typedef long long ll; const int maxx = 200010; const int inf = 0x3f3f3f3f; using namespace std; unordered_map<ll, ll> mp; int main() { int n; cin >> n; ll a; ll ans = -1; for (ll i = 1; i <= n; i++) { cin >> a; mp[a - i] += a; ans = max(ans, mp[a - i]); } cout << ans << endl; return 0; }
|
C题
题意:一个字符串,如果与某个位置相邻的字母,至少有一个比该位置的字母小1,那么该位置的字母就可以删掉,剩下的字母接上来,输出对于整个字符串,最多可以删多少个字母。
思路:这道题的话,直接暴力,不难想到先删字母大的,然后再删小的可以保证删的最多,所以就从 ‘z’ 遍历到 ‘a’, 一个一个删,当前字母不能删就往前循环。
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <bits/stdc++.h> typedef long long ll; const int maxx = 200010; const int inf = 0x3f3f3f3f; using namespace std; string s; int main() { int n; while (cin >> n >> s) { for (char i = 'z'; i >= 'b'; i--) { if (s.size() == 1) break; while (1) { if (s.size() == 1) break; int flag = 1; for (int j = 0; j < s.size(); j++) { if (s[j] != i) continue; if (j == 0) { if (s[j + 1] == i - 1) { flag = 0; s.erase(s.begin() + j, s.begin() + j + 1); break; } } else if (j == s.size() - 1) { if (s[j - 1] == i - 1) { flag = 0; s.erase(s.begin() + j, s.begin() + j + 1); break; } } else { if (s[j - 1] == i - 1 || s[j + 1] == i - 1) { flag = 0; s.erase(s.begin() + j, s.begin() + j + 1); break; } } } if (flag) break; } } cout << n - s.size() << endl; } return 0; }
|