传送门

pts85/90(90应该是个意外,第一次交是90之后都是85了):

优先队列模拟题意

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n,m,q,u,v,t,tim;
double p;
priority_queue<int>qq;
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/(1.0*v);
for(int i=,x;i<=n;i++){
scanf("%d",&x);
qq.push(x);
}
while(m--){
tim++;
int x=qq.top();
qq.pop();
if(tim%t==)printf("%d ",x+(tim-)*q);
int y=(int)(p*(double)(x+(tim-)*q));
x=(x+(tim-)*q)-y;
qq.push(x-tim*q),qq.push(y-tim*q);
}
printf("\n");
int now=;
while(qq.size()){
now++;
if(now%t==){
printf("%d ",qq.top()+tim*q);
}
qq.pop();
}
return ;
}

优先队列

顺手练一下手写二叉堆

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,q,u,v,t,tim,a[*],num;
double p;
bool cmp(int x,int y){
return x>y;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/(1.0*v);
for(int i=,x;i<=n;i++){
scanf("%d",&a[i]);
x=i;
while(x>&&a[x]>a[x>>]){
swap(a[x],a[x>>]);
x>>=;
}
}
while(m--){
tim++;
int x=a[];
if(tim%t==)printf("%d ",x+(tim-)*q);
int y=(int)(p*(double)(x+(tim-)*q));
x=(x+(tim-)*q)-y;
a[]=x-tim*q;
int now=;
while((a[now]<a[now<<]||a[now]<a[now<<|])&&(now<<|)<=n){
if(a[now<<]<a[now<<|]){
swap(a[now],a[now<<|]);
now<<=;
now|=;
}
else{
swap(a[now],a[now<<]);
now<<=;
}
}
if(a[now]<a[now<<]&&(now<<)<=n){
swap(a[now],a[now<<]);
}
a[++n]=y-tim*q;
now=n;
while(now>&&a[now]>a[now>>]){
swap(a[now],a[now>>]);
now>>=;
}
}
printf("\n");
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
if(i%t==){
printf("%d ",a[i]+tim*q);
}
}
return ;
}

手写二叉堆

正解:

发现先切的蚯蚓产生的长段永远不小于后切的蚯蚓产生的长段,短段也是。因为从准备切先切的开始,后切的生长t个单位长度的同时,先前切好的两段都生长了t-1个单位长度。

切好的长段集合和短段集合本身就具有单调性。

用三个队列分别储存未切的,切好的长段,切好的短段,每次从三个队头寻找最大的进行操作。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,q,u,v,t,tim,maxx,pos,a[*],inf=;
double p;
queue<int>qq[];
bool cmp(int x,int y){
return x>y;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/(1.0*v);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+,a+n+);
for(int i=n;i>=;i--)qq[].push(a[i]);
while(m--){
tim++;
maxx=pos=-inf;
if(qq[].front()>maxx&&qq[].size())maxx=qq[].front(),pos=;
if(qq[].front()>maxx&&qq[].size())maxx=qq[].front(),pos=;
if(qq[].front()>maxx&&qq[].size())maxx=qq[].front(),pos=;
qq[pos].pop();
if(tim%t==)printf("%d ",maxx+(tim-)*q);
int y=(int)(p*(double)(maxx+(tim-)*q));
maxx=(maxx+(tim-)*q)-y;
qq[].push(max(maxx,y)-tim*q),qq[].push(min(maxx,y)-tim*q);
}
printf("\n");
n=;
while(qq[].size()){
a[++n]=qq[].front();
qq[].pop();
}
while(qq[].size()){
a[++n]=qq[].front();
qq[].pop();
}
while(qq[].size()){
a[++n]=qq[].front();
qq[].pop();
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
if(i%t==){
printf("%d ",a[i]+tim*q);
}
}
return ;
}

最新文章

  1. Java篇-File类之常用操作
  2. 跟我学Windows Azure 三 使用vs2013创建windows azure web site
  3. Cube Processing Options
  4. Activity后台运行一段时间回来crash问题的分析与解决
  5. PHP中MySql函数收集
  6. fork 函数 和vfork 函数的区别
  7. VS2010安装中遇到的错误
  8. P55、面试题6:重建二叉树
  9. $_GLOBALS超全局数组和global定义的全局变量区别?
  10. duck
  11. CSS3选择器在HTML5中的使用
  12. eclipse创建一个文件夹
  13. 字符编辑技术C语言实现
  14. PHP——base64的图片的另类上传方法
  15. Spring-Cloud-Config学习笔记(一):使用本地存储
  16. Sql Server性能定位及改善
  17. 解决Firefox显示“已阻止载入混合活动内容”的方法
  18. laravel架构
  19. pta l3-1(凑零钱)
  20. django之创建第8个项目-数据库配置及同步研究

热门文章

  1. springmvc 拦截器不拦截jsp,只拦截控制器的访问
  2. UVA-11987-Almost Union-Find-并查集的基本操作合并、删除、移位
  3. JS数组 二维数组 二维数组的表示 方法一: myarray[ ][ ];方法二:var Myarr = [[0 , 1 , 2 ],[1 , 2 , 3, ]]
  4. 02.MyBatis在DAO层开发使用的Mapper动态代理方式
  5. F. Cowmpany Cowmpensation dp+拉格朗日插值
  6. 2-sat——输出方案poj3683
  7. iOS之UIButton的normal和selected状态切换
  8. 利用R语言制作出漂亮的交互数据可视化
  9. webservice技术--服务器端
  10. PAT甲级——A1074 Reversing Linked List