Flower:
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6486
题解:
逆向思维+规律
因为每次剪n-1,所以逆向就是控制n-1朵不变,每次增高1朵,直到所有等高,即所有的高度都等于最高的那一朵,记录增高的次数为sum,反过来就是最高的那个减少sum,
如果减少sum后小于1则不成立,大于等于1,则需要减少sum次。
sum=每朵花与最高的差的和。
AC代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int main() 5 { 6 int t; 7 scanf("%d",&t); 8 while(t--) 9 { 10 ll n; 11 scanf("%lld",&n); 12 int i; 13 ll a[100010]; 14 for(i=0;i<n;i++) 15 { 16 scanf("%lld",&a[i]); 17 } 18 sort(a,a+n); 19 ll sum=0; 20 for(i=0;i<n;i++) 21 { 22 sum+=(a[n-1]-a[i]); 23 } 24 if(a[n-1]-sum<1) 25 printf("-1 "); 26 else 27 printf("%lld ",sum); 28 } 29 return 0; 30 }