usaco Barn Repair
第一感觉就是这个题应该是一个dp,分析了好久状态转移方程,似懂非懂,反正程序是不知道怎么下手,dp对我来说是最难得部分之一。看了下这一节应该是贪心算法才对。后面想了想,用了个猥琐的解法。把数组排序一遍,要是相邻的两个元素是a=b+1的关系,他们就共用一根木棒,因为即使后面那间用一根新的木棒也不会省长度。这样就把数组化成了几块。再说那些相邻的数之间还有数存在的。把他们的距离保存下来。然后排序,设有x块,有y根木棒,那么还要消除x-y个空隙,直接把这x-y个空隙的长度加到总长度里面,ac。
/* ID: like_091 PROG: barn1 LANG: C++ */ #include<iostream> #include<fstream> #include<algorithm> #include<string> #include<map> using namespace std; const int MAX = 250; int main(void) { ifstream cin("barn1.in"); ofstream cout("barn1.out"); int n, m, s; int d[MAX], value[MAX]; while (cin>>m>>s>>n) { for (int i = 0; i < n; i++) cin>>d[i]; sort(d, d + n); int k = 1, tot = 0, temp[200], l = 0; for (int i = 0; i < n; i++) { if (!i) value[i] = k++; else if (d[i] == d[i - 1] + 1) value[i] = value[i - 1]; else { temp[l++] = d[i] - d[i - 1]; value[i] = value[i - 1] + 1; } tot++; } sort(temp, temp + l); for (int i = 0; i <= l - m; i++) tot += temp[i] - 1; cout<<tot<<endl; } return 0; }