题目描述
植物大战僵尸这款游戏中,有一种植物武器叫辣椒炸弹,在草坪中的任意一格摆放它可以把草坪中该行上的所有僵尸瞬间消灭,也就是说,如果在第i行中任意位置摆放一个炸弹,第i行中的所有僵尸就瞬间都被杀死了。现在我们假定草坪有r行c列,草坪中有n只僵尸,僵尸不移动,现在给你k个辣椒炸弹,要求只能使用这k个炸弹来消灭这些僵尸,请问最多可以杀死多少只僵尸?注意不能空炸
输入
第一行4个正整数r,c,k,n;
接下来n行,每行两个正整数x,y,表示第x行的第y列中有一只僵尸。
输出
第1行输出最多可以杀死的僵尸数;
第2行按顺序输出所有被消灭的行,如果有不同方案,输出字典序最小的那种方案。
样例输入
4 6 2 6
1 3
2 3
3 1
4 4
4 5
4 6
样例输出
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<bits/stdc++.h>
using namespace std;
int r,c,k,n,x,y,s,ans,sum,a[1000001],b[1000001],f;
int main()
{
int max=0;
cin>>r>>c>>k>>n;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
a[x]++;
}
while(k>0)
{
f=0;
max=0;
ans=0;
for(int i=1;i<=r;i++)
{
if(a[i]>max)
{
max=a[i];
ans=i;
}
}
if(max!=0)
{
sum++;
s=s+max;
b[sum]=ans;
k--;
a[ans]=0;
}
else
break;
for(int j=1;j<=r;j++)
{
if(a[j]!=0)
{
f=1;
break;
}
}
if(f==0)
break;
}
cout<<s<<endl;
sort(b+1,b+sum+1);
for(int i=1;i<=sum;i++)
cout<<b[i]<<" ";
return 0;
}