请问大佬们,为什么这种思路会错呢

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

@[冰冻罗非鱼](/user/225941) 此题应该是**区间动规**啊
by __LePetitPrince__ @ 2020-02-25 12:26:17


@[XTH号游侠](/user/255169) 和区间动规有什么关系……
by critnos @ 2020-02-25 12:27:22


@[XTH号游侠](/user/255169) 石子合并才是区间动规吧
by mazihang2022 @ 2020-02-25 12:28:48


@[冰冻罗非鱼](/user/225941) 你好又看见你了 这道题有一点就是合并之后会变成新的一堆,所以每一堆的合并次数不一定像你的B数组一样 如:6 6 7 8 6_6 ->12 变成7 8 12 此时合并的是7_8并非开始最小的12 7_8 ->15 变成12 15 12_15->27 合并完成 可以发现那两个6只合并了2次,并非你计算的三次
by mazihang2022 @ 2020-02-25 12:29:20


@[XTH号游侠](/user/255169) 这个是合并果子,你那个是合并石子……
by FZzzz @ 2020-02-25 12:29:38


名字好评
by Yukinoshita_Yukino @ 2020-02-25 12:31:59


~~看到您的名字想起了《三体》~~
by JS_TZ_ZHR @ 2020-02-25 12:55:20


谢谢大佬们,已经明白了
by 冰冻罗非鱼 @ 2020-02-25 12:58:36


这个…… 是我的打开方式不对吗 ``` #include<iostream> #include<string> #include<queue> #include<set> #include<algorithm> using namespace std; long long ans,n; multiset<int> a; int main(){ cin >> n; for(int i = 1; i <= n; i++){ int e; cin >> e; a.insert(e); }while(a.size() >= 2){ multiset<int>::iterator it = a.begin(); int x = *it; a.erase(a.find(*it)); int y = *it; a.erase(a.find(*it)); ans += x + y; a.insert(x + y); }cout << ans; return 0; } ```
by 冰冻罗非鱼 @ 2020-02-25 13:08:42


@[冰冻罗非鱼](/user/225941) 用优先队列就可以了,不用multiset
by critnos @ 2020-02-25 13:14:11


| 下一页