A. Greedy Monocarp
思路:注意问题要求,就行。他每次都从拿走最大的那个,那么我们很容易想到用个大根堆(当然用数组后排序也可以),遍历累加,遇到超过的不要,答案为还差的值,正好为k输出0.
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
void solve()
{
int n, m, k;
cin >> n >> k;
priority_queue<int> pq;
for (int i = 0; i<n; i++){
int x; cin >> x;
pq.push(x);
}
int sum = 0, flag = 0;
while (!pq.empty() && sum < k){
if (sum + pq.top() == k){
sum += pq.top();
flag = 1;
break;
}
else if (sum + pq.top() > k){
break;
}
else {
sum += pq.top();
pq.pop();
}
}
if (flag == 1){
cout << 0 <<endl;
}
else {
cout << k-sum << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
B. Game with Colored Marbles
思路:可以讲情况分为两种:出现一次,出现多次,对于出现一次的Alice只能拿到其中(n/2)向上取整个;对于出现多次,Alice每种颜色都能拿到。最后乘上他们的权重相加即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, m, k;
cin >> n;
int x;
map<int, int> mp;
set<int> s; //出现一次
set<int> v; //出现多次
for (int i= 0; i<n; i++) {
cin >> x;
if (mp[x] == 0){
s.insert(x);
}
mp[x]++;
if (mp[x] > 1) {
s.erase(x);
v.insert(x);
}
}
int ans = ceil((double)s.size()/2)*2+v.size();
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
C. Competitive Fishing
思路:由题得我们有(n-1)个空隙可以来分隔,所以我们事先算出每个空隙对整体的贡献,从后往前遍历,再对其排序,就能从最高的贡献开始取,能超过k就输出。一道很好的思维题,看代码比较好理解。
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, m, k;
cin >> n >> k;
string s;
cin >> s;
vector<int> d(n+1, 0);
for (int i = n-1; i>=0; i--){
d[i] = d[i+1]+(s[i]=='0'?-1:1);
}
d.erase(d.begin()+n);
d.erase(d.begin());
sort(d.begin(), d.end(), greater<int>());
// for (auto x:d){
// cout << x << " ";
// }
// cout << endl;
int sum = 0;
for (int i = 0; i<d.size(); i++){
sum += d[i];
if (sum >= k){
cout << i+2 << endl;
return ;
}
}
cout << -1 << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t = 1; cin >> t;
while (t--)
{
solve();
}
return 0;
}
(如果有帮助请点赞或评论支持,有问题请指正,其他问题请评论交流...)
都看到这里了真不点个赞吗