The Desire of Asuna
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
ZYHAzwraith用自己心爱的键盘换来了很多支漂亮的荧光棒!
一天,他准备用一条由很多个莹光圈相互连接而成的荧光链送给女神Asuna。每个荧光圈只能由一支荧光棒首尾相接成一个环得到。现在他手中有
现在ZYHAzwraith想知道最少需要多少次才能把这些荧光链链拼接成一条长链?
Input
第一行是一个整数
Output
输出一个整数表示最少的次数。
Sample input and output
Sample Input | Sample Output |
---|---|
3
3 2 1
|
1
|
3
4 3 4
|
2
|
Hint
第一组样例解释:
Source
第七届ACM趣味程序设计竞赛第三场(正式赛)
贪心。
我们选择长度减小的链,一定是可选的,并且长度最小的链。
我们选择合并的链,一定是当前长度最大的两条链。
为什么?
假设所有的链的长度都是无限长,这道题的答案毫无疑问就是 n-1 。
但是长度并不是无限长的,所以我们可以通过 使得链长度-1 的这个操作,去除一些链,使得答案比 n-1 小
很容易可以看出,我们之前的贪心策略,可以使得尽量多的链在 长度-1 这个阶段就被消去了。
所以这道题就结束了。
我们选择长度减小的链,一定是可选的,并且长度最小的链。
我们选择合并的链,一定是当前长度最大的两条链。
为什么?
假设所有的链的长度都是无限长,这道题的答案毫无疑问就是 n-1 。
但是长度并不是无限长的,所以我们可以通过 使得链长度-1 的这个操作,去除一些链,使得答案比 n-1 小
很容易可以看出,我们之前的贪心策略,可以使得尽量多的链在 长度-1 这个阶段就被消去了。
所以这道题就结束了。
<span style="font-family:KaiTi_GB2312;font-size:18px;">#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[2005]; int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); int l=1,r=n,ans=0; while(l<r) { a[l]--; r--; ans++; a[r]+=a[r+1]+1; if(a[l]==0) l++; } cout<<ans<<endl; } return 0; }</span><span style="font-family:Open Sans, Helvetica Neue, Helvetica, Helvetica, Arial, sans-serif;font-size:32px;"> </span>