1. 程式人生 > >uva-10720-貪心

uva-10720-貪心

  題意:對於一個簡單圖(不存在平行邊和自旋邊),輸入所有的點的度,問,能不能變成一個簡單圖.

解題思路:

可圖化定理.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>

namespace
cc { 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; constexpr
int 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; }