ABC 246 C - Coupon(思维)
怎么最近连纯思维题都写不出来了???
我人傻了
https://atcoder.jp/contests/abc246/tasks/abc246_c
题目大意:
给定n个价钱,我们手里有k个优惠卷,每个优惠卷都可以减7元;
假如一个是a元,那么我们可以把它的价钱变成max{0,a-k*x},不能够低于0元;
问我们合理分配这k张优惠卷,买下这n个东西使用的最小价格总数是多少?
Sample Input 1
5 4 7
8 3 10 5 13
Sample Output 1
12
Sample Input 2
5 100 7
8 3 10 5 13
Sample Output 2
0
Sample Input 3
20 815 60
2066 3193 2325 4030 3725 1669 1969 763 1653 159 5311 5341 4671 2374 4513 285 810 742 2981 202
Sample Output 3
112
-
当我们的优惠卷数量特别充裕的时候,每次遇到一个优惠卷都先满打满算用完它,比如第一个样例,先把大于等于7元的全部使用掉,这样就能确保7元的优惠卷是没有浪费的
-
紧接着,我们来到了余数大比拼的时候,那就是看利用程度了,那必然是最大的余数使用一张合算多了,所以直接从大到小使用直到用不了为止,
-
剩下的结果就是答案
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
LL a[N];
bool cmp(LL l,LL r)
{
return l>r;
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n,k,x;
cin>>n>>k>>x;
for(LL i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]>=x&&k>=1) //无差别先➖
{
LL num=min(k,a[i]/x);
a[i]-=num*x;
k-=num;
}
}
sort(a+1,a+1+n,cmp);
LL sum=0;
for(LL i=1;i<=n;i++)
{
//cout<<a[i]<<" ";
if(k!=0)
{
k--;
a[i]=0;
}
else sum+=a[i];
}
cout<<sum<<endl;
}
return 0;
}