题意在大白书上。
有3 种工作 abc 大于等于平均年龄的可以去做a c 工作, 小于平均年龄的可以去做 bc , 同样转化为2 -sat 去做, 因为对于每个人也只有2 种情况可以作为选择
#include#include #include #include #include using namespace std;const int maxn=100000+10;struct TwoSAT{ int n; vector G[maxn*2]; bool mark[maxn*2]; int S[maxn*2],c; bool dfs(int x){ if(mark[x^1]) return false; if(mark[x]) return true; mark[x]=true; S[c++]=x; for(int i=0; i n =n; for(int i=0; i<2*n; ++i) G[i].clear(); memset(mark,0,sizeof(mark)); } void add_clause(int x, int xval, int y, int yval){ x = x * 2 + xval; y = y * 2 + yval; G[x^1].push_back(y); G[y^1].push_back(x); } bool solve(){ for(int i=0; i 0) mark[ S[ --c ] ] = false; if(!dfs(i+1)) return false; } } return true; }}solver;int n,m,total_age;int age[maxn];bool isyoung(int x){ return x*n