植物大战僵尸这款游戏中,有一种植物武器叫辣椒炸弹,在草坪中的任意一格摆放它可以把草坪中该行上的所有僵尸瞬间消灭,也就是说,如果在第i行中任意位置摆放一个炸弹,第’i行中的所有僵尸就瞬间都被杀死了。现在我们假定草坪有r行c列,草坪中有n只僵尸,僵尸不移动,现在给你k个樱桃炸弹,要求只能使用这k个炸弹来消灭这些僵尸,请问最多可以杀死多少只僵尸?
输入
第1行4个正整数r,c,k,n;
接下来n行,每行两个正整数x,y,表示第x行的第y列中有一只僵尸。
输出
第1行输出最多可以杀死的僵尸数;
第2行按顺序输出所有被消灭的行,如果有不同方案,输出字典序最小的那种方案。
样例输入
4 5 2 6
1 3
2 3
3 1
4 4
4 5
4 5
样例输出
4
1 4
提示
样例说明:可以杀死第1行和第4行的所有僵尸,方案(1,4),(2,4),(3,4)都是一样多的僵尸,但方案(1,4)的字典序最小。
【数据规模】
对于30%数据:0<r,c≤50,n≤2500;
对于100%数据:0<r,c≤1000,n≤1000000,k≤r 。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct zombie
{
int h;
int l;
int ch,num;
};
bool cmp(struct zombie a,struct zombie b)
{
if (a.num!=b.num)
return a.num>b.num;
else
return a.ch<b.ch;
}
void Input (struct zombie a[],int n,int r)
{
int i;
for (i=0;i<n;i++)
{
scanf("%d%d",&a[i].h,&a[i].l);
}
for (i=1;i<=r;i++)
{
a[i].ch=i;
a[i].num=0;
}
for (i=0;i<n;i++)
{
a[a[i].h].num++;
}
}
void SORT(struct zombie a[],int k,int r,int sum)
{
int x[1005],i;
sort(a+1,a+r+1,cmp);
for (i=1;i<=k;i++)
{
sum=sum+a[i].num;
}
printf("%d\n",sum);
for (i=1;i<=k;i++)
{
x[i]=a[i].ch;
}
sort(x+1,x+k+1);
for (i=1;i<=k;i++)
{
printf("%d ",x[i]);
}
}
struct zombie a[1000010];
int main()
{
int r,c,n,k;
int sum=0;
scanf("%d%d%d%d",&r,&c,&k,&n);
Input(a,n,r);
SORT(a,k,r,sum);
}