<span style="color: inherit; line-height: 1.1; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255);">The Desire of Asuna</span>
<span style="color: inherit; line-height: 1.1; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255);">The Desire of Asuna</span>
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
ZYHAzwraith用自己心爱的键盘换来了很多支漂亮的荧光棒!
一天,他准备用一条由很多个莹光圈相互连接而成的荧光链送给女神Asuna。每个荧光圈只能由一支荧光棒首尾相接成一个环得到。现在他手中有 n 条荧光链,为了最后把这些链拼接成一条链,每次他可以选择任意一条荧光链中的任意一个荧光圈并用魔法把这个圈断开,然后用这个断开的荧光圈去连接任意两条荧光链使之成为一条。
现在ZYHAzwraith想知道最少需要多少次才能把这些荧光链链拼接成一条长链?
Input
第一行是一个整数 n ( 1≤n≤2000 ), 表示有 n 条荧光链。 接下来一行有 n 个数,每个数 ai ( 1≤ai≤105 )表示第 i 条链由 ai 个荧光圈相互连接
Output
输出一个整数表示最少的次数。
Sample input and output
Sample Input | Sample Output |
---|---|
3 3 2 1 | 1 |
3 4 3 4 | 2 |
Hint
第一组样例解释:
Source
第七届ACM趣味程序设计竞赛第三场(正式赛)
噗~现在明白啦,比赛时卡的要命;贴个代码
//UESTC-1263(贪心)
//有n条由荧光圈构成的荧光链,输入每个荧光链的荧光圈数,现在要将这n个链连成一条链。
//每次他可以选择任意一条荧光链中的任意一个荧光圈并用魔法把这个圈断开,
//然后用这个断开的荧光圈去连接任意两条荧光链使之成为一条。问最少需要断开多少个荧光圈,才能将其连成一条链。
//贪心题,假如用a[i]表示第i条链的荧光圈数,首先将n个数按升序排列。从最小的链开始,每次从a[i]中断开一个圈,这时若
//a[i]==1那么连接任意两个链后n=n-2;否则由于断开a[i]的一个圈后,a[i]还剩a[i]-1个圈。相当于减少了两个链又增加了一条。
//所以此次后n=n-1; 可知当连的n==1或n==2时就可以退出循环直接输出了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[2001];
int main()
{
int i,j,k,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n); //从小到大排序
k=0,i=0;
while(n)
{
for(j=a[i];j>0;j--)
{
if(n<=2) break; //当圈数连的小于等于2时;直接可以跳出循环。
if(a[i]==1)
n-=2; //当a[i]==1或a[i]还剩的等于1时;可以消去两个圈。
else
{
n-=1; //否则消去一个圈
a[i]--; //链a[i]剩余的圈数
}
k++; //记录断的圈数
}
if(n==2)
{
k++; break; //当还剩两部分时,加1后退出
}
else if(n==1)
break; //否则直接退出。
}
printf("%d\n",k); //打印出最少断圈数。
}
return 0;
}