【排序】辣椒炸弹

植物大战僵尸这款游戏中,有一种植物武器叫辣椒炸弹,在草坪中的任意一格摆放它可以把草坪中该行上的所有僵尸瞬间消灭,也就是说,如果在第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);
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值