Problem - E - Codeforces
题意给你一组数,和特定的数k,要求求两两数相加除以k(下取整)之和的最大价值(n为偶数)
这题草率了,我原来单纯的以为就最大的次大的相加相除,以此类推
后来又想了想,肯定不是,因为下取整,多出来的数相当于是没用意义的,还不如去和缺少数的去组合,这样的方法肯定不是最优策略
我想到和余数有关,但是不会实现,好像连思路都不是那么明朗,多做题多积累吧
两个数相加/k,本身的数不会变,值会越加越大,所以在本身先取余,不管和谁组合,本身的价值在那,然后把每个本身的价值先加起来,然后看看特定的多出来的数,再把这些多出来的数尽最优来组合,(多出来的这些数就是用取余来算的),取余的数最大的两个相加也不可能超过2*k,所以先排个序吧,双指针来算,这样就是贪心的最优策略了
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int main(){
int T;
cin>>T;
while(T--)
{
ll sum=0;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i]/k;
a[i]%=k;
}
sort(a+1,a+n+1);
int l=1,r=n;
while(l<r)
{
if(a[l]+a[r]>=k)
{
sum++;
l++;
r--;
}
else l++;
}
cout<<sum<<"\n";
}
return 0;
}
多多积累题型