//错误解法
// #include<iostream>
// #include<vector>
// #include<algorithm>
// using namespace std;
// //贪心
// int main()
// {
// int n,k;
// cin>>n>>k;
// vector<long long> a(n);
// for(int i =0;i<n;i++) cin>>a[i];
// sort(a.begin(),a.end(),greater<long long>());//贪心核心
// // for(int i =0;i < n;i++)cout<<a[i]<<endl;
// long long sum = 0;
// vector<int> tmp;
// for(int i =0;i < n;i++)
// {
// if(a[i]%2==0)tmp.push_back(a[i]);
// }
// for(int i =0;i<tmp.size();i++)
// {
// while(k>0 && tmp[i] >= tmp[i+1] && tmp[i] % 2 == 0)
// {
// tmp[i]/=2;
// k--;
// }
// sum+=tmp[i];
// }
// for(int i =0;i<n;i++)
// {
// if(a[i] % 2 != 0)
// {
// // cout<<sum<<endl;
// sum+=a[i];
// }
// }
// cout<<sum<<endl;
// return 0;
// }
这道题就是通过贪心和模拟,我的大致方向是对的,但是需要利用数据结构堆来进行排序,而再我之前,我是用的排序然后插入偶数数组内,再一个一个比较的,这种写起来很费力,而且还容易出问题,所以只有50的测试用例过了。然后再编写后面这个正确代码的同时我也出现了再第一个错误代码所出现的问题,就是没有把类型变为long long(第一个错误代码,没加这个直接就是0的测试用例,后面休正才过50%),然后导致我这里明明逻辑没问题,而且我也输入了一些自己像的用例也没问题,关键就是这里的sum可能会出界,因为这边可能有10万个数据,而且每个数据最大还是10的九次方,很容易超过int的最大值。
//利用贪心+数据结构堆+模拟
#include<iostream>
#include<queue>
#include<vector>
const int N = 100000;
int n,k;
int a[N];
using namespace std;
int main()
{
//建大堆
priority_queue<long long,vector<long long>,less<long long>> pq;
cin>>n>>k;
long long sum = 0;
//提取偶数
for(int i =0; i < n;i++)
{
cin>>a[i];
if(a[i] % 2 == 0)pq.push(a[i]);
sum+=a[i];
}
//贪心
while(!pq.empty() && k--)
{
//取栈
long long x = pq.top() /2;
//出栈
pq.pop();
//入栈
if(x % 2 == 0)pq.push(x);
sum -= x;
}
cout<<sum<<endl;
return 0;
}
全部评论
(0) 回帖