uva-10720-貪心
阿新 • • 發佈:2018-12-22
題意:對於一個簡單圖(不存在平行邊和自旋邊),輸入所有的點的度,問,能不能變成一個簡單圖.
解題思路:
可圖化定理.https://blog.csdn.net/shuangde800/article/details/7857246
對所有點的度從大到小排序,每次都選取一個度最大的點(度為n),往後的n個點度數每個都減一,如果,發現出現負數,或者不夠減,那就不能變成簡單圖.
WA了很多次,主要錯在以下倆個原因,剛開始從小的開始刪除.考慮下面這組輸入,
4 1 1 2 2,如果從小的開始刪,第一次刪除後變成 0 0 2 2 ,這個一個錯誤的圖.
第二次只排了一次.
第一次排序後 d1 >= d2 >= d3 >= ......dn,但是在刪除一次後,不保證序列還是遞減.
#include "pch.h" #include <string> #include<iostream> #include<map> #include<memory.h> #include<vector> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<math.h> #include<iomanip> #include<bitset> namespacecc { using std::cout; using std::endl; using std::cin; using std::map; using std::vector; using std::string; using std::sort; using std::priority_queue; using std::greater; using std::vector; using std::swap; using std::stack; using std::bitset; constexprint N = 10010; int a[N]; int n; bool check() { for (int i = 0;i < n - 1;i++) { sort(a + i, a + n, greater<int>()); if (i + a[i] >= n) return false; for (int j = i + 1;j <= i + a[i];++j) { --a[j]; if (a[j] < 0)return false; } } if (a[n - 1] != 0) return false; return true; } void solve() { while (cin >> n && n) { memset(a, 0, sizeof(a)); int ok = 1; for (int i = 0;i < n;i++) { cin >> a[i]; if (a[i] >= n) { ok = 0; } } if (ok == 1 && check()) { cout << "Possible" << endl; } else { cout << "Not possible" << endl; } } } }; int main() { #ifndef ONLINE_JUDGE freopen("d://1.text", "r", stdin); #endif // !ONLINE_JUDGE cc::solve(); return 0; }