Codeforces Round #760 (Div. 3) D 贪心 思维

46 篇文章 2 订阅

题目

给你有N个数的数组a ,
定义操作
任意取两个下标不同的数ai , aj ,将他们删除,并将 ai/aj 下取整加入所得分数。
你只能进行k次操作,操作后,数组剩余的数需要加入得分中,求所得的最小得分。

题解思路

贪心
为了保证最小,只考虑前2k的数来删除,删小的不如删大的,如果留下大的,就不能保证最小得分了。
在2
k个数中继续贪心。
全局考虑,肯定有大有小,我们总是拿小的去除大的。
但是当一个数出现的数量大于k,那这个数对面的数就不是比他大的数了,这样只能得到1。
在这里插入图片描述

实力不够,心服口服。
打acm就是应该不断被虐,然后成长。

AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long

using namespace std;

const  int  INF =  0x3f3f3f3f;
const  int  N =  200100;
int a[N] ;
int vis[N] ;
int n , k ;
int T ;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin >> T ;
    while ( T-- )
    {
        int cnt = 0 ; 
        cin >> n >> k ;
        for (int i = 1 ; i <= n ; i++ )
            cin >> a[i] , vis[i] = 0 ;
        sort(a+1,a+1+n) ; 
        long long ans = 0 ;
        for (int i = 1 ; i <= n - 2*k ; i++ )
        {
            ans += a[i] ; 
        }
        int t1 = n , t2 = n - 2*k + 1 ; 
        int sp = (t1 + t2 )/2 ;
        for (int i = t1 ; i >= t2 ; i-- )
        {
            if ( a[sp] == a[i] )
                cnt++; 
        }
        if ( cnt > k )
            ans += cnt - k ; 
        cout << ans << "\n" ; 
    }
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值