首先将输入的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; }