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;
}
posted @ 2022-10-03 20:19  Vijurria  阅读(45)  评论(0编辑  收藏  举报