首先將輸入的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; }