AOJ > vol21 > 2104

AOJ - 2104 : Country Road (カントリーロード)

問題概要

日本語文があるので省略。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2104

解法

貪欲に解けます。

始め、家がある位置全てに発電所があると仮定します。
もし、kがn以上であるならば、このとき答えは0になります。

次に、kがn-1であるならば、現在n個ある発電所の内、1つだけなくさなくてはいけないということがわかります。
なくすという表現をしていますが、最も隣同士の距離が近い発電所同士を併合してやればいいだけです。
あとは、この処理を(n-k)回行えばいいです。

プログラム

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. int n, k;
  7. int t[100002];
  8.  
  9. int main(){
  10. int T;
  11. cin >> T;
  12.  
  13. while(T--){
  14. vector<int> vec;
  15.  
  16. cin >> n >> k;
  17. k = min(k, n); //kは、nよりでかくなくていい
  18.  
  19. for(int i = 0; i < n; i++){
  20. cin >> t[i];
  21. if(i != 0) vec.push_back(t[i] - t[i - 1]); //隣の家との距離をpush_back
  22. }
  23.  
  24. //家同士の距離を昇順にソート
  25. sort(vec.begin(), vec.end());
  26.  
  27. int ans = 0;
  28. for(int i = 0; i < n - k; i++){
  29. ans += vec[i];
  30. }
  31. cout << ans << endl;
  32. }
  33. }
最終更新:2013年11月04日 15:59