当前位置: 代码迷 >> 综合 >> 【Codeforces Beta Round #26 】Codeforces 26E Multithreading
  详细解决方案

【Codeforces Beta Round #26 】Codeforces 26E Multithreading

热度:79   发布时间:2024-01-13 10:43:38.0

首先特判掉 w<0 w>ni n=1 的情况。然后一定是合法的。
不妨升序排列,按照 w n1 的关系分类讨论目的是最后一次操作为 1 ,且之前存下的 y1 w?1
如果 n1w 比较简单,先选 1 到只剩两次,这时 y 还没有超过 w?1 。然后进行其他操作,当 y=w?1 时执行 1 ,最后再执行一次 1
如果 n1>w ,直接选 1 的话就超了 w 。需要借助 2 来帮忙。先选一次 2 ,然后选 1 到只剩两次。然后把 2 操作完,当 y=w?1 时执行 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]);}
}
  相关解决方案