USACO1.3 Barn Repair(barn1)

        首先將輸入的c個數據排序,排序以後,依次求出先後數據之差,對差值排序,求出最大的m-1個差值之和sum,利用公式ans=end-beg-sum+m;其中end是輸入的c個數據最大值,beg是輸入的c個數據的最小值。首次提交時覺得輸入的數據是排好序的致使錯誤,看來對於題目沒有明確表示的信息不能自覺得是。ios

 

/*
ID:jzzlee1
PROG:barn1
LANG:C++
*/
#include <fstream>
#include<iostream>
#include<list>
#include<cstring>
using namespace std;
ifstream fin("barn1.in");
ofstream fout("barn1.out");
int main()
{
	int m,s,c;
	fin>>m>>s>>c;
	int ans;
		list<int> lis,lit;
	int x,y,i,dif;
	//將數據輸入到lit中保存並排序*********************************
	for(i=0;i!=c;i++)
	{
		fin>>x;
		lit.push_back(x);
	}
	lit.sort();
	list<int>::iterator iter,itend=lit.begin();itend++;
	//for(iter=lit.begin();iter!=lit.end();++iter)
		//cout<<*iter<<" ";
	//求出lit中每組數據的先後之差,將差值保存進lis並排序************************
	for(iter=lit.begin();itend!=lit.end();iter++,itend++)
	{
		dif=*itend-*iter;
		lis.push_back(dif);
	}
	//for(iter=lis.begin();iter!=lis.end();++iter)
	//	cout<<*iter<<" ";
	//若是m>=c,也就是每一個門能夠用一塊木板,則長度爲c
	if(m>=c)
		{
			ans=c;
		}
	else
	{
	lis.sort();
	list<int>::iterator it=lis.end();
	int sum=0;
	//求出最大的m-1個差值的和
	for(i=0;i<m-1;i++)
	{
		sum+=*(--it);
	}
	iter=lit.begin();itend=lit.end();itend--;
	//cout<<*iter<<" "<<*itend<<" ";
	//計算結果
	ans=*itend-*iter-sum+m;
	}
	fout<<ans<<endl;
	return 0;
}
相關文章
相關標籤/搜索