2 条题解

  • 0
    @ 2026-8-28 14:31:55

    贪心。

    为了让每次优惠价值最大化,我们一定是优先对价格 x\ge x 的物品使用优惠券。

    剩下的物品中,因为再用之后价格会变为 00,所以原价格越大越赚。

    #include<bits/stdc++.h>
    using namespace std;
    int a[200005];
    int main(){
    	int n,k,x;
    	cin>>n>>k>>x;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    		if(a[i]>x){
    			if(k>a[i]/x){
    				k-=a[i]/x;
    				a[i]=a[i]%x;
    			}
    			else{
    				a[i]=a[i]-k*x;
    				k=0;
    			}
    		}
    	}
    	sort(a+1,a+n+1);
    	for(int i=n;i>=1 && k;i--){
    		a[i]=0;
    		k--;
    	}
    	long long ans=0;
    	for(int i=1;i<=n;i++){
    		ans=ans+a[i];
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 0
      @ 2026-8-28 14:27:50
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;//       这
      #define int long long//别把 俩  位置搞反了,后果很严重(会RE)
      int a[N];
      signed main()
      {
      	memset(a,0,sizeof a);
      	int n,k,x,cnt=0,ans=0;cin>>n>>k>>x;
      	for(int i=1;i<=n;i++)
      	{
      		cin>>a[i];
      		cnt+=a[i]/x,ans+=a[i];
      		a[i]=-a[i]%x;
      	}
      	if(cnt>=k)return cout<<ans-k*x,0; 
      	sort(a+1,a+n+1);
      	ans-=cnt*x;
      	cnt=k-cnt;
      	for(int i=1;i<=min(n,cnt);i++)ans+=a[i];//一定要加加min(n,cnt)要不然会RE
      	cout<<ans;
      }
      
      • 1

      信息

      ID
      12444
      时间
      2000ms
      内存
      1024MiB
      难度
      7
      标签
      递交数
      47
      已通过
      11
      上传者