#队列#洛谷 2827 蚯蚓

题目

m 秒内,每一秒被切断的蚯蚓被切断前的长度(有 m 个数); m 秒后,所有蚯蚓的长度(有 n + m 个数)。PS:长度为x的蚯蚓被切成 u v x x u v x


分析

用优先队列(堆)TLE,后,发现被切的蚯蚓是单调递减的,那么队列代码就弄好了。


85分代码

#include <cstdio>
#include <cctype>
#include <queue>
using namespace std;
int n,m,q1,u,t,add; double p; 
priority_queue<int>q;
int in(){
    int ans=0; char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans; 
}
void print(int ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
int main(){
    n=in(); m=in(); q1=in(); u=in(); p=(double)u/in(); t=in();
    for (int i=1;i<=n;i++) q.push(in());
    for (int i=1;i<=m;i++){
        int k=q.top()+add; q.pop();//当前蚯蚓的长度
        if (i%t==0) print(k),putchar(' ');
        int k1=(int)(k*p),k2=k-k1;
        q.push(k1-q1-add); q.push(k2-q1-add); add+=q1;//插入堆
    }
    putchar('\n');
    for (int i=1;i<=n+m;i++,q.pop()) if (i%t==0) print(q.top()+add),putchar(' ');//输出
    return 0;
}

100分代码

#include <cstdio>
#include <queue>
#include <algorithm>
#include <cctype>
using namespace std;
int n,m,q,u,v,t,add,a[100001];
queue<int>ans,q1,q2;
bool cmp(int x,int y){return x>y;}
int in(){
    int ans=0; char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans;
}
int gett(queue<int>&x){
    return x.empty()?-0x7f:x.front()+add;
}
int max_fr(){
    int a=gett(ans),b=gett(q1),c=gett(q2),big=max(a,max(b,c));
    if(big==a) ans.pop(); else if(big==b) q1.pop(); else if(big==c) q2.pop(); return big;
}
void print(int ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
int main(){
    n=in(); m=in(); q=in(); u=in(); v=in(); t=in();
    for(int i=1;i<=n;i++) a[i]=in();
    sort(a+1,a+1+n,cmp);//排序
    for(int i=1;i<=n;i++) ans.push(a[i]);
    for(int i=1;i<=m;add+=q,i++){
        int k=max_fr();//取出最大的蚯蚓
        int l1=(long long)k*u/v,l2=k-l1;
        q1.push(l1-add-q);q2.push(l2-add-q);//插入队列
        if(i%t==0) print(k),putchar(' ');
    }
    putchar('\n');
    for(int i=1;i<=n+m;i++) if (i%t==0) print(max_fr()),putchar(' '); else max_fr();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/81164715