做题记录:P2827 蚯蚓

P2827 蚯蚓

AC代码:

/*
思路:三队列模拟。
第一个队列存放原始的蚯蚓长度(已从大到小排序)。
第二个队列存放蚯蚓被切后的一份的长度([px])。
第三个队列存放蚯蚓被切后的另一份的长度(x-[px])。
每次在三个队列的队头中取一个最大值并将其出队,然后将其分成两份分别存在第二、三个队列里。
因为每一次我们都是切最长的,而当我们切下一条时两条原来属于上一条的蚯蚓又会增长,
所以先切一定大于后切的,第二、三个队列也就是单调递减的了。
除此之外,还要加一个标记,记录当前每一条蚯蚓应增加的长度,操作时就加上,入队时就减去,输出时也要加上,
这样就不用一个一个加了。
*/
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
    using namespace std;
struct duilie//手打队列
{
    int head;//队首
    int tail;//队尾
    int d[7100005];//队列
}dl[3];
int main()
{
    dl[0].head=dl[1].head=dl[2].head=1;//初始化队首队尾
    dl[0].tail=dl[1].tail=dl[2].tail=1;
    int n=0,m=0,q=0,t=0,k=0;
    double u=0,v=0;
    scanf("%d%d%d%lf%lf%d",&n,&m,&q,&u,&v,&t);
    for(int i=1;i<=n;i++)
    {
        int a=0;
        scanf("%d",&a);
        dl[0].d[dl[0].tail++]=a;//入队
    }
    sort(dl[0].d+dl[0].head,dl[0].d+dl[0].tail,greater<int>());//从大到小排序
    for(int i=1;i<=m;i++)
    {
        int x=-2147483647,y=0,l1=0,l2=0;
        for(int j=0;j<3;j++)//在三个队首中取最大值
            if(dl[j].head<dl[j].tail&&dl[j].d[dl[j].head]>x)
            {
                x=dl[j].d[dl[j].head];
                y=j;
            }
        dl[y].head++;//将最大值出队
        x+=k;//加上当前标记
        k+=q;//更新标记
        l1=x*(u/v);//计算一段蚯蚓的长度
        l2=x-l1;//计算另一段蚯蚓的长度
        dl[1].d[dl[1].tail++]=l1-k;//分别入队
        dl[2].d[dl[2].tail++]=l2-k;
        if(i%t==0) printf("%d ",x);//同时输出这一秒切的蚯蚓的长度
    }
    printf("\n");//记得换行
    for(int i=1;i<=n+m;i++)//输出m秒后每只蚯蚓的长度
    {
        int x=-2147483647,y=0;
        for(int j=0;j<3;j++)//在队首中取最大值
            if(dl[j].head<dl[j].tail&&dl[j].d[dl[j].head]>x)
            {
                x=dl[j].d[dl[j].head];
                y=j;
            }
        dl[y].head++;//将最大值出队
        if(i%t==0) printf("%d ",x+k);//输出
    }
    printf("\n");//记得换行
    return 0;
}

80分优先队列代码:(注意:手打堆会更快一些,能拿到85分或以上,原理跟优先队列一样)

/*80分思路:弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,
然后一分为二入队,简单模拟即可。还要弄一个标记,表示从开始到当前时间每
一条蚯蚓应该加上的长度,操作时就加上,入队时就减去,输出时也要加上,这
样就不用一个一个加了。 */
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
#include<queue>
    using namespace std;
    priority_queue<int> d;
int main()
{
    int n=0,m=0,q=0,t=0,k=0;
    double u=0,v=0;
    scanf("%d%d%d%lf%lf%d",&n,&m,&q,&u,&v,&t);
    for(int i=1;i<=n;i++)
    {
        int a=0;
        scanf("%d",&a);
        d.push(a);//入队
    }
    for(int i=1;i<=m;i++)
    {
        int w=d.top(),l1=0,l2=0;
        d.pop();
        w+=k;//加上标记
        k+=q;//更新标记
        l1=w*(u/v);//计算长度
        l2=w-l1;
        d.push(l1-k);//一分为二入队
        d.push(l2-k);
        if(i%t==0) printf("%d ",w);//同时输出这一秒切的蚯蚓的长度
    }
    printf("\n");//换行
    for(int i=1;i<=n+m;i++)
    {
        if(i%t==0) printf("%d ",d.top()+k);//输出m秒后每一条蚯蚓的长度
        d.pop();//队首元素出队
    }
    printf("\n");//换行
    return 0;
}

原文地址:https://www.cnblogs.com/wozaixuexi/p/8457394.html

时间: 2024-11-09 10:12:07

做题记录:P2827 蚯蚓的相关文章

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

project euler做题记录

ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{array}{c} S(n) & = & \sum_{i = 1} ^ n \sum_{p = 1} ^ i \sum_{q = p + 1} ^ i \frac {1}{pq}[p + q \geq i][gcd(p, q) = 1] \& = & \sum_{i = 1} ^

退役前的做题记录5.0

退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径.对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可. [Wannafly挑战赛4F]线路规划 类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置

清华集训2014 做题记录

清华集训2014做题记录 已完成 [清华集训2014]玛里苟斯 [清华集训2014]主旋律 [清华集训2014]奇数国 [清华集训2014]矩阵变换 [清华集训2014]sum [清华集训2014]虫逢 [清华集训2014]玄学 [清华集训2014]文学 未完成 [清华集训2014]卡常数 [清华集训2014]简单回路 [清华集训2014]Router [清华集训2014] Breaking Bomber 写一题要膜一题题解,膜完题解膜代码,膜完代码膜指导,膜了好几天了还有四个题没做. [清华集

2020年3月做题记录

[不定时更新,赶论文,赶项目,1月~2月做题记录还在整理,自我训练] 反转链表 链接:https://leetcode-cn.com/problems/reverse-linked-list/ 类名: 考察点:链表.迭代.递归 解题过程: 力扣3月每日1题,题解链接: https://leetcode-cn.com/problems/reverse-linked-list/solution/di-2ci-da-qia-lian-biao-fan-zhuan-di-gui-by-wu-xi-/ 就

Educational Codeforces Round 79做题记录

这套题感觉出的不咋滴,第四题和第五题难度差了1000分!!! 前四题都还简单,第五题就31人做出……我算了…… 懒得写题解了,做个记录吧(这就是偷懒的理由???) 比赛传送门 A.New Year Garland 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #define re

2020年3月底到4月第1周做题记录(力扣)

写在前面的话: 多看书,整完论文,deadline驱动,加油. 做题时间: 2020年3月30日~2020年4月5日 记录: 总共道题,时间为min. 最近更新时间: 202003230 圆圈中最后剩下的数字 链接: https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/ 类名: 考察点: 环.模拟 解题过程:力扣3月每日1题 题目的意思是用n个数字形成一个圆圈,数字范围为0到n-1,数

2017雅礼省选集训做题记录

嘛,最近在补雅礼省选前集训的题.都是我会做的题..那一定是最水的那些题啦 题目在loj.ac上都有.过段时间如果搬了雅礼NOI集训的题应该也会做做的吧.. Day1 T1 一道经典套路题,做法跟UOJ #228基础数据结构练习题类似. 使用线段树维护.考虑相邻两个数的差值最多变化log次.也就是说,对于每个区间,只要操作二进行大概log次就能使得这个区间内所有数完全一样.所以对于操作二,只要记录一下区间最大最小值,就能直接打标记或者暴力DFS下去. 和UOJ那个题一样,注意一个特殊情况,就是一个