1 条题解

  • 1
    @ 2023-3-26 19:43:32

    https://www.luogu.com.cn/blog/516346/solution-at-abc252-f

    闲话

    原题 P1334 瑞瑞的木板。刚好不久前做过,赛时直接贺了自己的代码过掉的。

    题目翻译

    为方便和瑞瑞的木板联系起来,下文翻译不采用原题中的“面包”而是使用“木板”。

    有一根长度为 LL 的木板,切成 nn 根小木板。第 ii 根小木板的长度为 lil_i,每次切下长度为 xx 的小木板需要耗费 xx 的体力。允许有剩余,也就是说不保证 L=i=1nliL=\sum_{i=1}^n l_i

    题目思路

    本题与瑞瑞的木板唯一区别,即不保证 L=i=1nliL=\sum_{i=1}^n l_i。为了方便我们贺代码,我们可以自己加一块长度为 Li=1nliL-\sum_{i=1}^n l_i 的木板。这时耗费体力肯定不变。

    那么这题就完美的变成了瑞瑞的木板。接下来,我们按照合并果子的贪心思想,每次切最小的即可。详细的贪心证明可以去看 P1090 合并果子 的题解。

    完整代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	multiset<long long>s;
    	long long n,l,ss=0;
    	cin>>n>>l;
    	for(int i=1;i<=n;i++)
    	{
    		long long x;
    		cin>>x;
    		s.insert(x);
    		ss+=x;
    	}
    	if(l-ss!=0)s.insert(l-ss);//插入新的小木板
    	long long sum=0;	
    	while(s.size()>1)
    	{
    		long long x=*s.begin();
    		s.erase(s.begin());
    		long long y=*s.begin();
    		s.erase(s.begin());
    		s.insert(x+y);
    		sum+=x+y;
    	}
    	cout<<sum<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    585
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    11
    已通过
    11
    上传者