辣椒炸弹

来源:互联网 发布:网络金融股 编辑:程序博客网 时间:2024/04/26 03:16

【题目描述】
植物大战僵尸这款游戏中,有一种植物武器叫辣椒炸弹,在草坪中的任意一格摆放它可以把草坪中该行上的所有僵尸瞬间消灭,也就是说,如果在第i行中任意位置摆放一个炸弹,第i行中的所有僵尸就瞬间都被杀死了。现在我们假定草坪有r行c列,草坪中有n只僵尸,僵尸不移动,现在给你k个樱桃炸弹,要求只能使用这k个炸弹来消灭这些僵尸,请问最多可以杀死多少只僵尸。
【输入格式】
第一行4个正整数r,c,k,n;
接下来n行,每行两个正整数x,y,表示第x行的第y列中有一只僵尸。
【输出格式】
第一行输出最多可以杀死的僵尸数;
第二行按顺序输出所有被消灭的行,如果有不同方案,输出字典序最小的那种方案。
【输入样例】
4 5 2 6
1 3
2 3
3 1
4 4
4 5
4 5
【输出样例】
4
1 4
【数据规模】
对于30%数据:0<r,c≤50, n≤2500;
对于100%数据:0<r,c≤1000, n≤1000000,k≤r。
【分析】
打上标记,排序即可。

#include<cstdio>#include<algorithm>using namespace std;struct Edge{    int sum,id;}book[1000010];int sort_id[1010];bool cmp(Edge x,Edge y){    if (x.sum>y.sum) return true;    if (x.sum==y.sum && x.id<y.id) return true;    return false;}int main(){    int r,c,k,n,x,y;    scanf("%d%d%d%d",&r,&c,&k,&n);    for (int i=1;i<=n;i++){        scanf("%d%d",&x,&y);        book[x].sum++;    }    for (int i=1;i<=r;i++) book[i].id=i;    sort(book+1,book+1+r,cmp);    int ans=0;    for (int i=1;i<=k;i++) ans+=book[i].sum;    printf("%d\n",ans);    for (int i=1;i<=k;i++) sort_id[i]=book[i].id;    sort(sort_id+1,sort_id+1+k);    for (int i=1;i<=k;i++) printf("%d ",sort_id[i]);}
3 0
原创粉丝点击