http://acm.hdu.edu.cn/showproblem.php?pid=6486
题意: 共有n朵花,每次必须修剪n-1朵,但是花的高度不能小于1,问修剪几次才能使n朵花一样高,若能实现就输出次数,否则输出-1;
这个题如果用cin和cout的话,一定要加上std::ios::sync_with_stdio(false); cin.tie(0),cout.tie(0);
来提高效率,否则会时间限制,而且还有一个变态的条件是数组要从0开始,不可以从1开始输入,不知道为什么,求解。
下面是思路,一开始只是简单的觉得,只要有三个以上不同的数,他就一定不能成功,又觉得可能有好几种不同的减法,就可以有多个不同的数,但是又举不出例子来证明这是看了别人给出的例子,才知道了,真的是可以的,然后在纸上模拟一下
一开始肯定是留下一个最小的数,然后用其他数和他作差,只要最后都是大于1的,如果只考虑剩余数中最小的呢个,当他大于1的时候,显然还可以再减,所以我们去看他最大的呢个数可以减几次,减到和最小值相等为止
这时候最小值一定变了(除非这n个数已经相同,而这种正好是一个和n-1个),但是这个最小值一定不是刚刚的最大值,所以他还可以继续减,再次减成现在的最小值,以此类推,得出最后的结果其实就是最大值和其余每个值的差。
当最大值大于这个差,就说明可以减出来,否则,就不可能实现。
5 8 9 10->2 2 2 2
#include <iostream>
#include <algorithm>
using namespace std;
int a[100005],n,sum,i;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
cin>>n;
sum=0;
for(i=0; i<n; i++)
{
cin>>a[i];
}
sort(a,a+n);
for(i=0; i<n-1; i++)
{
sum+=a[n-1]-a[i];
}
if(sum>=a[n-1])
cout<<-1<<endl;
else cout<<sum<<endl;
}
return 0;
}