http://community.topcoder.com/stat?c=problem_statement&pm=12107
此题想了半天,当时瞥到了Greedy,所以就想着贪心,最后的方法又纸上画了一下应该是对的。就是排序后依次看是不是满足要求。证明就是如果对数字X,有a和b都能够通过增加k的倍数步得到X,那么使用小的a自然更好,因为b有更大机会为剩下的出力。
#include <string> #include <vector> #include <algorithm> using namespace std; class IncrementingSequence { public: string canItBeDone(int k, vector <int> A) { sort(A.begin(), A.end()); vector<bool> used(A.size()); for (int i = 1; i <= A.size(); i++) { for (int j = 0; j < A.size(); j++) { if (used[j]) continue; if (A[j] > i) return "IMPOSSIBLE"; if ((A[j] - i) % k == 0) { used[j] = true; break; } } } return "POSSIBLE"; } };