题目
给你有N个数的数组a ,
定义操作
任意取两个下标不同的数ai , aj ,将他们删除,并将 ai/aj 下取整加入所得分数。
你只能进行k次操作,操作后,数组剩余的数需要加入得分中,求所得的最小得分。
题解思路
贪心
为了保证最小,只考虑前2k的数来删除,删小的不如删大的,如果留下大的,就不能保证最小得分了。
在2k个数中继续贪心。
全局考虑,肯定有大有小,我们总是拿小的去除大的。
但是当一个数出现的数量大于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 ;
}