Flower
发布日期:2021-05-08 16:30:27 浏览次数:12 分类:精选文章

本文共 914 字,大约阅读时间需要 3 分钟。

题意: 共有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 
#include
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
>a[i]; } sort(a,a+n); for(i=0; i
=a[n-1]) cout<<-1<
上一篇:Goodbye(博弈)
下一篇:21.4.24周末总结(第七次)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月04日 08时05分17秒