Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

其实就是“合并果子”的反向版,时光倒流加贪心即可。

Posted by Miracle1 at 2018-02-20 10:42:29 on Problem 3253
n块小木板,只要锯n-1次,时光倒流的想法,使得每一次锯的木板最短。
所以,每次合并最短的两块小木板,那么这一次锯的就是这块合并后的木板,并且它一定是所有这一次可能会锯的木板中最小的。
采用优先队列小根堆实现,先将n块木板放入队列中,每次取出队首的两块,做合并,合并后的木板当做一块再放入队列中,直到合并了n-1次。输出ans即可。
注意:1.ans要开long long
     2.正向考虑时每次锯下n块中最长的,这种贪心是不行的。因为无法保证比先分成几组再分组锯的花费少。
       例如:4块 7 6 5 4。 采用这种方法锯出来是46,而答案是44.实际上应该先锯出13、9两块再分组锯。
附上代码:(29行,16ms,316K)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<queue>
using namespace std;
int n;
long long ans;
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
	scanf("%d",&n);
	int t;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		q.push(t);
	}
	for(int i=1;i<=n-1;i++)
	{
		int a=q.top();q.pop();
		int b=q.top();q.pop();
		ans=ans+a+b;
		q.push(a+b);
	}
	printf("%lld",ans);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator