【Codeforces Beta Round #26 】Codeforces 26E Multithreading

首先特判掉 w<0 w>ni n=1 的情况。然后一定是合法的。
不妨升序排列,按照 w n1的关系分类讨论目的是最后一次操作为 1 ,且之前存下的y1 w1
如果 n1w 比较简单,先选 1 到只剩两次,这时y还没有超过 w1 。然后进行其他操作,当 y=w1 时执行 1 ,最后再执行一次1
如果 n1>w ,直接选 1 的话就超了w。需要借助 2 来帮忙。先选一次2,然后选 1 到只剩两次。然后把2操作完,当 y=w1 时执行 1 。因为n2>w,一定存在这一时刻。之后就和上面一样了。

#include<cstdio>
#include<algorithm>
using namespace std;
int a[110],b[110];
int cmp(int x,int y)
{
    return a[x]<a[y];
}
int main()
{
    //freopen("in.txt","r",stdin);
    int s=0,w,n,y;
    scanf("%d%d",&n,&w);
    for (int i=1;i<=n;++i) scanf("%d",&a[i]);
    for (int i=1;i<=n;++i) b[i]=i;
    sort(b+1,b+n+1,cmp);
    for (int i=1;i<=n;++i) s+=a[i];
    if (w<0||w>s||(w==1&&a[b[1]]>1))
    {
        printf("No\n");
        return 0;
    }
    if (n==1)
    {
        if (w==a[1])
        {
            printf("Yes\n");
            for (int i=1;i<=2*a[1];++i) printf("1\n");
        }
        else printf("No\n");
        return 0;
    }
    printf("Yes\n");
    if (a[b[1]]<=w)
    {
        for (int i=1;i<=2*(a[b[1]]-1);++i) printf("%d ",b[1]);
        y=a[b[1]]-1;
        if (y==w-1) printf("%d ",b[1]);
        for (int i=2;i<=n;++i)
            while (a[b[i]]--)
            {
                printf("%d %d ",b[i],b[i]);
                y++;
                if (y==w-1) printf("%d ",b[1]);
            }
        printf("%d\n",b[1]);
    }
    else
    {
        printf("%d ",b[2]);
        for (int i=1;i<=2*(a[b[1]]-1);++i) printf("%d ",b[1]);
        y=1;
        printf("%d ",b[2]);
        if (y==w-1) printf("%d ",b[1]);
        for (int i=1;i<=a[b[2]]-1;++i)
        {
            printf("%d %d ",b[2],b[2]);
            y++;
            if (y==w-1) printf("%d ",b[1]);
        }
        for (int i=3;i<=n;++i)
            while (a[b[i]]--) printf("%d %d ",b[i],b[i]);
        printf("%d ",b[1]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值