zoukankan      html  css  js  c++  java
  • Atcoder Grand Contest 037C(贪心,优先队列,思维)

    #define HAVE_STRUCT_TIMESPEC//编译器中time.h和phread.h头文件中timespec结构体重名,故加此行
    #include<bits/stdc++.h>
    using namespace std;
    int a[200007],b[2000007];
    priority_queue<pair<int,int> >q;
    int n;
    int mi(int x){
    return x==1?n:x-1;
    }
    int pl(int x){
    return x==n?1:x+1;
    }
    int main(){
    cin>>n;
    for(int i=1;i<=n;++i)
    cin>>a[i];
    for(int i=1;i<=n;++i){
    cin>>b[i];
    q.push({b[i],i});
    }
    long long ans=0;
    while(!q.empty()){
    int i=q.top().second;
    q.pop();
    if(b[i]==a[i])
    continue;
    if(a[i]>b[i]-b[mi(i)]-b[pl(i)])//如果a[i]>b[i]-b[mi(i)]-b[pl(i)],那么a[i]加上已经等于b[i-1]的a[i-1]和已经等于b[i+1]的a[i+1]就会超过b[i],较小的a[i]会先变成b[i],明显是要小的b[i]先满足题意才能大的b[i]后满足题意,所以如果大的b[i],a[i]+b[i-1]+b[i+1]相加都比b[i]大,那么a[i]就大的无法得到了
    return puts("-1"),0;
    int tmp=b[mi(i)]+b[pl(i)];
    int tot=b[i]-a[i];//tot是还需要加上多少才能让a[i]变成b[i]
    ans+=tot/tmp;//tmp是每次能加上的最大值,这样贪心策略最优
    tot%=tmp;//tot保留余数
    b[i]=a[i]+tot;//b[i]变成一个小的数字,放在优先队列里排序,可以让i-1和i+1在变化的时候用到它,它是a[i]变成原来b[i]的一个中间值
    if(a[i]>b[i])
    return puts("-1"),0;
    if(a[i]!=b[i])
    q.push({b[i],i});//扔进队列等待处理中间值
    }
    cout<<ans;
    return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    Best Cow Line(POJ No.3617)
    迷宫的最短路径
    Lak3 Counting(POJ No.2386)
    【日志】-2013.11.02
    用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(上)
    用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(下)
    【日志】-2013.11.01
    (转载)HTML与XHTML有什么区别
    (转载)linux环境变量
    转载-KMP算法前缀数组优雅实现
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11377538.html
Copyright © 2011-2022 走看看