http://47.95.147.191/contest/6/problem/A

2021-04-15 01:27

阅读:643

标签:include   def   style   efi   ring   nbsp   priority   name   get   

http://47.95.147.191/contest/6/problem/A
这个题气其实是比较巧妙的。如果选了第3个,就不能选2,4。假设3是最大的,如果选2必选4,选2了却不选4那么不如选3.如果最优解是选2,4,但是贪心的时候选了3,怎么弥补呢?把a[3]=a[2]+a[4]-a[3]再放到优先队列里。

#include 
#include 
#include 
#include 
#include 
#include #define inf 2147483647
#define N 1000010
#define p(a) putchar(a)
#define For(i,a,b) for(long long i=a;i//by war
//2020.2.26
using namespace std;
long long n,m,k,ans;
long long a[N],l[N],r[N];
bool vis[N];

struct node{
    long long w;
    long long id;
    bool operator const node &x) const{
        return wx.w;
    }
};

priority_queueq;

void in(long long &x){
    long long y=1;char c=getchar();x=0;
    while(c‘0||c>9){if(c==-)y=-1;c=getchar();}
    while(c‘9&&c>=0){ x=(x1)+(x3)+c-0;c=getchar();}
    x*=y;
}
void o(long long x){
    if(x0){p(-);x=-x;}
    if(x>9)o(x/10);
    p(x%10+0);
}

void del(long long x){
    vis[x]=1;
    l[r[x]]=l[x];
    r[l[x]]=r[x];
    l[x]=r[x]=0;
}

signed main(){
    in(n);in(m);
    if(m*2>n){
        puts("Error!");
        return 0;
    }
    For(i,1,n){
        in(a[i]);
        r[i]=((i+1)%n==0?n:(i+1)%n);
        l[i]=(i-1==0?n:i-1);
        q.push((node){a[i],i});
    }
    For(i,1,m){
        while(vis[q.top().id]) q.pop();
        node t=q.top();q.pop();
        ans+=t.w;
        a[t.id]=a[l[t.id]]+a[r[t.id]]-a[t.id];
        del(l[t.id]);del(r[t.id]);
        q.push((node){a[t.id],t.id});
    }
    o(ans);
    return 0;
}

 

http://47.95.147.191/contest/6/problem/A

标签:include   def   style   efi   ring   nbsp   priority   name   get   

原文地址:https://www.cnblogs.com/war1111/p/12368760.html


评论


亲,登录后才可以留言!