2016 CCPC网络赛
题意:每桌放两个物品,分别作为特殊礼物和普通礼物,要求任意相邻桌的特殊礼物不同种类。现在给定n种物品的数量,求最多能布置多少桌。 - 原题链接
假设现在已经放了i-1种物品,记物品总数为sum,其中需要同类相邻物品有ret+1个。在放置第i种物品时处理三种情况:
- 若a[i]>=sum,则第i种物品一一插空,更新ret
- 若a[i]>=ret,先插空隔开同类相邻物品,剩余随意插空,更新ret为0
- 若a[i]<ret,先插空隔开相邻物品,更新ret
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int maxn=10+5; int T, n, a[maxn]; int main() { scanf("%d", &T); for(int TT=1; TT<=T; TT++) { scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%d", &a[i]); sort(a+1, a+1+n); int sum=0, ret=0; for(int i=n; i>=1; i--) { if(a[i]>=sum) ret=a[i]-1-sum; else if(a[i]>=ret) ret=0; else ret-=a[i]; sum+=a[i]; } printf("Case #%d: %d\n", TT, min(sum-ret, sum/2)); } return 0; }
|