ローリングボルダー - 貪欲な思考

H「土」転がる石

質問の意味:M <= 0すぐに崩壊したときに土壌のボールは、安定した値mを有します。それは障害物が> M、M = MAの安定性の損失、ストライカーM = M + B後の回復のその後の安定性を必要と当たったとき、各バリアは、二つの回復特性B、損傷しています。Mと所定のすべての障害、Bは、外観の崩壊順序を受けることができるすべての障害の障害が存在するか否かを判定する。
ソリューション:貪欲。これらは最大に、メートルをメートルを増加させ、その後、障害物BA <0のに実行されるので、第1のバンプBA>障害物0ヒットを行きます。BA> 0:プレス小さな大規模に、あなたは多くの障害として以上確保できるようにします。AB:これは少し証明を必要とする、結論は次のとおりです。bは下降に応じて。簡単な証明:答えは「イエス」である場合は、最後のmは、逆のプロセスを検討し、決定しなければならないが、逆、唾安定した値を加えた損失の安定した値を復元することです(のような正のプロセスを見て?)必要に応じて、そのM> 0を確保するため、および-b + A> 0(フォワード及びフロントBA> 0同じプロセス)、これは、Bを下降に応じて、Bが前方に上昇されます。

#include<bits/stdc++.h>
using namespace std;
struct ac{
    long long a,b,get;
}arr[500010];
bool cmp(ac a1,ac a2){
    if(a1.get>0&&a2.get>0) return a1.a<a2.a;
    else if(a1.get==0&&a2.get==0) return a1.a<a2.a;
    else if(a1.get<0&&a2.get<0) {
            return a1.b>a2.b;
    }
    else
        return a1.get>a2.get;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        long long n,m;
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;++i){
            scanf("%lld%lld",&arr[i].a,&arr[i].b);
            arr[i].get=arr[i].b-arr[i].a;
        }
        sort(arr+1,arr+n+1,cmp);
        int cnt=0;
        int f=1;
        for(int i=1;i<=n;++i){
            if(arr[i].a<m){
                m+=arr[i].get;
            }
            else {
                f=0;
                cout<<"No"<<endl;
                break;
            }
        }
        if(f==0) continue;
        cout<<"Yes"<<endl;
    }
    return 0;
}
公開された96元の記事 ウォン称賛11 ビュー2278

おすすめ

転載: blog.csdn.net/weixin_43769146/article/details/103330181