NOIP2016全国信息学分区联赛提高组第二试 蚯蚓

蛐蛐国面临蚯蚓灾害,神刀手每秒选择最长蚯蚓将其按长度比例p切割。求经过若干秒后,蚯蚓总长度变为不超过k的最小整数秒数。问题涉及动态规划和数学计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3。蛐蛐国最近蚯蚓成灾了!隔壁跳
蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有n只蚯蚓(n为正整
数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,…,n),并保证所有的长度都是非负整数(即:可
能存在长度为0的蚯蚓)。每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)
将其切成两半。神刀手切开蚯蚓的位置由常数p(是满足0

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define inf 0x7fffffff
const int N=7.2e6;
int n,m,q,u,v,t;
long long a[N],b[N],c[N];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1,cmp);
    int ah=1,bh=1,ch=1,at=n,bt=0,ct=0;
    for(int i=1;i<=m;i++)
    {
        long long mx=-inf;
        int w=0;
        if(ah<=at&&a[ah]>mx)
        {
            mx=a[ah];
            w=1;
        }
        if(bh<=bt&&b[bh]>mx)
        {
            mx=b[bh];
            w=2;
        }
        if(ch<=ct&&c[ch]>mx)
        {
            mx=c[ch];
            w=3;
        }
        mx+=(i-1)*q;
        if(i%t==0)
        {
            printf("%lld",mx);
            if(i+t<=m) printf(" ");
        }
        switch(w)
            {
                case 1:ah++;break;
                case 2:bh++;break;
                case 3:ch++;break;
            }

        int x=floor(mx*u/v),y=mx-x;
        x-=i*q; y-=i*q;
        if(x<y) swap(x,y);
        b[++bt]=x; c[++ct]=y;
        for(int j=bt;j>bh&&b[j-1]<b[j];j--)
            swap(b[j-1],b[j]);
        for(int j=ct;j>ch&&c[j-1]<c[j];j--)
            swap(c[j-1],c[j]);  
    }
    printf("\n");
    int i=0;
    while(ah<=at||bh<=bt||ch<=ct)
    {
        i++;
        long long mx=-inf;
        int w=0;
        if(ah<=at&&a[ah]>mx)
        {
            mx=a[ah];
            w=1;
        }
        if(bh<=bt&&b[bh]>mx)
        {
            mx=b[bh];
            w=2;
        }
        if(ch<=ct&&c[ch]>mx)
        {
            mx=c[ch];
            w=3;
        }
        if(i%t==0)
        {
            printf("%lld",mx+m*q);
            if(i+t<=n+m) printf(" ");
        }
        switch(w)
            {
                case 1:ah++;break;
                case 2:bh++;break;
                case 3:ch++;break;
            }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值