NOIP2016提高组day2 蚯蚓

55 篇文章 0 订阅
8 篇文章 0 订阅

Description

这里写图片描述

Data Constraint

这里写图片描述
这里写图片描述

Solution

我们先讨论一下假设有两条蚯蚓x,y(x>y),那么分别切完他们后最终的长度分别为p*x+q,p *(y+q)。将括号去掉就为p *x+q,p *y+p *q。那么显然有p *x+q>p *y+p *q。所以我们可以得出一个结论:先切的到最后还是先切,后切的还是后切。

所以我们用三个数组,分别存:x、p*x,x-p *x。每次从三个数组中选出一个最大的切,切完后加入到p *x,x-p *x数组的队尾。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=8000005;
struct code{
    ll l,t;
}d[3][maxn];
ll n,m,q,u,v,p,i,t,j,k,l,num,x,y,a[maxn],f[3],g[3],b[maxn];
double z;
int pan(ll x){
    ll t=-1,i;
    for (i=0;i<=2;i++){
        if (f[i]>g[i]) continue;
        if (t<0 || d[i][f[i]].l+(x-d[i][f[i]].t)*q>=d[t][f[t]].l+(x-d[t][f[t]].t)*q) t=i;
    }
    return t;
}
int main(){
    freopen("earthworm.in","r",stdin);freopen("earthworm.out","w",stdout);
    scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&p);
    for (i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    for (i=1;i<=n;i++)
        d[0][i].l=a[n-i+1],d[0][i].t=1;
    f[0]=f[1]=f[2]=1;
    g[0]=n;
    for (i=1;i<=m;i++){
        t=pan(i);
        x=d[t][f[t]].l+(i-d[t][f[t]++].t)*q;
        if (!(i%p)) printf("%d ",x);
        d[1][++g[1]].l=x*u/v*1.0;
        d[2][++g[2]].t=d[1][g[1]].t=i+1;
        d[2][g[2]].l=x-d[1][g[1]].l;
    }
    printf("\n");
    for (i=1;i<=n+m;i++){
        t=pan(i);
        x=d[t][f[t]].l+(m+1-d[t][f[t]++].t)*q;
        if (!(i%p)) printf("%d ",x);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值