题目
求 秒内,每一秒被切断的蚯蚓被切断前的长度(有 个数); 秒后,所有蚯蚓的长度(有 个数)。PS:长度为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;
}