Codeforces Round #792 (Div. 1 + Div. 2)D

问题描述

提示:这里描述项目中遇到的问题:

nn陷阱编号从11nn.您将按顺序逐个浏览它们。这我我-第 0 个陷阱交易一个我ai基地伤害你。

与其经历陷阱,不如把它跳过。您最多可以跳过kk陷阱。如果你跳过一个陷阱,它不会对你造成任何伤害。但是还有一个额外的规则:如果你跳过一个陷阱,所有下一个陷阱的伤害都会增加11(这是一个额外的伤害)。

请注意,如果你跳过陷阱,你不会得到任何伤害(基础伤害和奖励伤害都没有)。此外,额外伤害也会叠加,例如,如果你通过陷阱我我基础损坏一个我ai,并且您已经跳过了33陷阱,你得到(一个我+3)(一个i+3)损伤。

你必须找到最小的伤害,如果你被允许跳过不超过kk陷阱。

输入

输入由多个测试用例组成。第一行包含单个整数tt (1≤吨≤1001≤吨≤100) — 测试用例的数量。测试用例的说明如下。

每个测试用例的第一行包含两个整数nnkk (1≤n≤2⋅1051≤n≤2⋅105,1≤ 千≤1≤ 千≤) — 陷阱的数量和允许你进行的跳跃次数。

每个测试用例的第二行包含nn整数一个1,一个2,...,一个na1,a2,...,an (1≤一个我≤1091≤ai≤109) — 所有陷阱的基本伤害值。

保证nn所有测试用例不超过2⋅1052⋅105.

输出

对于每个测试用例输出一个整数 - 如果您被允许跳过不超过k陷阱。 }


题目分析:

我们通过题目可以知道跳过一次陷阱,会导致后边陷阱伤害增加,那么我们可以将跳过该陷阱导致后续的伤害一起转移到该陷阱上,然后我们按照造成伤害的大小排序,去掉最大造成伤害的陷阱即可


代码:

  1. #include<iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. const int N=4e5+10;
  6. typedef pair<int,int>PII;
  7. PII p[N]; int n,k;
  8. bool cmp(PII a,PII b)
  9. {
  10. return a.first-(n-a.second)>b.first-(n-b.second);
  11. }
  12. int main ()
  13. {
  14. int t;
  15. cin>>t;
  16. while(t--)
  17. {
  18. cin>>n>>k;
  19. long long sum=0;
  20. for(int i=1;i<=n;i++)
  21. {
  22. cin>>p[i].first;
  23. sum+=p[i].first;
  24. p[i].second=i;
  25. }
  26. sort(p+1,p+n+1,cmp);
  27. long long ct=0;
  28. for(int i=1;i<=k;i++)
  29. {
  30. sum-=p[i].first-(n-p[i].second);sum-=ct;
  31. ct++;
  32. }
  33. cout<<sum<<endl;
  34. }
  35. }
  36. 题目选自
  37. https://codeforces.com/contest/1684/my
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值