zoukankan      html  css  js  c++  java
  • 贪心排序

    链接:https://ac.nowcoder.com/acm/contest/2272/H
    来源:牛客网

    帕秋莉掌握了一种土属性魔法

    她使用这种魔法建造了一个大型的土球,并让其一路向下去冲撞障碍

    土球有一个稳定性x,如果x < 0,它会立刻散架

    每冲撞一个障碍,土球会丧失ai的稳定性,冲撞之后,又会从障碍身上回馈bi的稳定性

    帕秋莉想知道,如果合理的安排障碍的顺序,在保证土球不散架的情况下,是否可以将障碍全部撞毁呢?

    输入描述:

    输入一个整数T,代表T组数据,每组数据中:
    前一行两个整数n , m,表示障碍个数和土球的稳定性
    接下来一行两个整数,分别表示障碍的ai和bi

    输出描述:

    若可以,输出“Yes”(不含引号),否则输出“No”(不含引号)
    示例1

    输入

    复制
    1
    5 50
    49 49
    52 0
    5 10
    26 24
    70 70

    输出

    复制
    No

    备注:

    Σn <= 500000, 1<=m<=100000,0<=a,b<=100000

    这个就是一个贪心的思路,按照b[i]-a[i]和0的大小分成两个数组
    1.b[i]-a[i]>0,就是撞完这个增加,就按照a[i]从小到大排序就是花费的越小越好
    2.b[i]-a[i]<0,就是撞完减少,按照b[i]从大到小排序,就是回复的越大越好

    #include<iostream>
    #include<algorithm>
    #include<cstring> 
    typedef long long ll;
    using namespace std;
    const int maxn=2e5+100;
    struct node{
        ll q,w;
    }a[maxn],b[maxn],c[maxn];
    bool cmp1(node x,node y){
        return x.q<y.q;
    }
    bool cmp2(node x,node y){
        return x.w>y.w;
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n;
            ll m;
            cin>>n>>m;
            int cnt1=0,cnt2=0;
            for(int i=1;i<=n;i++){
                scanf("%lld%lld",&a[i].q,&a[i].w);
                ll t=a[i].w-a[i].q;
                if(t>=0){
                    b[++cnt1]=a[i];
                }
                else{
                    c[++cnt2]=a[i];
                }
            }
            sort(b+1,b+cnt1+1,cmp1);
            sort(c+1,c+cnt2+1,cmp2);
            int flag=0;
            for(int i=1;i<=cnt1;i++){
                if(flag) break;
                if(m<b[i].q){
                    flag=1;
                    break;
                }
                m+=(b[i].w-b[i].q);
            }
            for(int i=1;i<=cnt2;i++){
                if(flag) break;
                if(m<c[i].q){
                    flag=1;
                    break;
                }
                m+=(c[i].w-c[i].q);
                if(m<0){
                    flag=1;
                    break;
                }
            }
            if(flag){
                printf("No
    ");
            }
            else{
                printf("Yes
    ");
            }
        }
    }


  • 相关阅读:
    《编程珠玑番外篇-O 中间语言和虚拟机漫谈》
    《编译原理之美》笔记——后端部分
    《编译原理之美》笔记——前端部分
    《从语言编译器源码入手,编译原理该这么学》
    知识图谱简介
    支持向量机原理讲解(一)
    一个完整的机器学习项目在Python中演练(四)
    多GPU使用详解
    数据可视化
    详解谱聚类原理
  • 原文地址:https://www.cnblogs.com/lipu123/p/14289824.html
Copyright © 2011-2022 走看看