题目链接
解题思路:
直接从众多“个数”中挑选满足答案的可能有很多。。。题目的限制条件是“find such array t that you can cut out the copy of t from s maximum number of times.” 所以要先二分找一个最大的amount,有了这个amount再去找k个满足的“个数”就可以啦
/* * @Author: Achan * @Date: 2018-11-17 00:21:36 * @Last Modified by: Achan * @Last Modified time: 2018-11-17 17:38:08 */
#include
using namespace std;
const int maxn = 2e5+2;
void read(int &x)
{
x=0;int f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
x*=f;return;
}
int n,k,t;
int a[maxn]; //个数
bool OK(int m)
{
int res = 0;
for(int i = 1; i <=(int)2e5 ; i++)
{
if(a[i] < m) continue;
res += a[i]/m;
}
return res >= k;
}
int main(void)
{
read(n), read(k);
for(int i = 0; i<n;i++) read(t),a[t]++;
int l = 1;
int r = n;
int mid , amount = 1; //在满足k个数的前题下,最大能进行的次数
while(l <= r) //二分答案 (答案区间:1 ~ n)
{
mid = (l+r)>>1;
OK(mid) ? amount = mid, l = mid + 1 : r = mid - 1;
}
// cout<
vector <int> ans(k);
int tot = 0;
for(int i = 1; i<=(int)2e5 ;i++)
{
if(a[i] < amount) continue;
for(int j = 1;j <= a[i]/amount; j++)
{
ans[tot++] = i;
if(tot == k)
{
i = (int )2e5 + 1;
break;
}
}
}
while(k--) printf("%d ",ans[k]);
puts("");
}
D. Cutting Out
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given an array s
consisting of n
integers.
You have to find any array t
of length k such that you can cut out maximum number of copies of array t from array s
.
Cutting out the copy of t
means that for each element ti of array t you have to find ti in s and remove it from s. If for some ti you cannot find such element in s, then you cannot cut out one more copy of t
. The both arrays can contain duplicate elements.
For example, if s=[1,2,3,2,4,3,1]
and k=3 then one of the possible answers is t=[1,2,3]. This array t can be cut out 2
times.
To cut out the first copy of t
you can use the elements [1,2––,3,2,4,3––,1––] (use the highlighted elements). After cutting out the first copy of t the array s can look like [1,3,2,4]
.
To cut out the second copy of t
you can use the elements [1––,3––,2––,4]. After cutting out the second copy of t the array s will be [4]
.
Your task is to find such array t
that you can cut out the copy of t from s
maximum number of times. If there are multiple answers, you may choose any of them.
Input
The first line of the input contains two integers n
and k (1≤k≤n≤2⋅105) — the number of elements in s and the desired number of elements in t
, respectively.
The second line of the input contains exactly n
integers s1,s2,…,sn (1≤si≤2⋅105
).
Output
Print k
integers — the elements of array t such that you can cut out maximum possible number of copies of this array from s. If there are multiple answers, print any of them. The required array t can contain duplicate elements. All the elements of t (t1,t2,…,tk) should satisfy the following condition: 1≤ti≤2⋅105
.
Examples
Input
Copy
7 3
1 2 3 2 4 3 1
Output
Copy
1 2 3
Input
Copy
10 4
1 3 1 3 10 3 7 7 12 3
Output
Copy
7 3 1 3
Input
Copy
15 2
1 2 1 1 1 2 1 1 2 1 2 1 1 1 1
Output
Copy
1 1
Note
The first example is described in the problem statement.
In the second example the only answer is [7,3,1,3]
and any its permutations. It can be shown that you cannot choose any other array such that the maximum number of copies you can cut out would be equal to 2
.
In the third example the array t
can be cut out 5
times.