這個題其實就是sat問題,是個npc,所以做這題基本上是休閒。
但其實分析資料可以發現每個資料都是有目的,並不完全是混亂的boolean表示式。
首先對於第
一、二兩個點資料其實質就是列舉,讓我想到了noip04年的等價表示式。。。囧。。。
point 3、4、5、6就是2-sat問題,本弱菜寫2-sat的題目不多,基本上中規中矩除讀入140幾行。構圖什麼的幾乎木有,裸的2-sat問題,345都可以滿足,6號點有三個無法滿足,不知是哪幾個,所以就為了方便刪了最後三個,好像碰上了的說。。。
7號點是狀態壓縮麼,將m個表示式按照讀入的第乙個變元序號排序,f[i][s]表示以i個式子變元為首的連續11個變元賦值為s的狀態下前i個式子最多滿足多少個,
然後就是環的處理,以跨過n號變元的式子為頭,再做一遍dp,與之前的取最優值就可以了。
8號點二分圖匹配,看一下資料就知道,對於每個式子,將差值為1的點**為一點,以變元可滿足式子的賦值作為壓縮的狀態賦為邊的屬性,匈牙利的時候記錄選的邊是哪條
9號點完全就是sat問題了,除了隨機模擬退火外沒有好的演算法。
10號點是個構造,很容易的,但是dp解法就不知如何想了。
code:point 3、4、5、6
#include#include#include#includetypedef int arr2[6000005];
typedef int arr[400005];
arr2 foll,link,poin,next,sta;
arr head,last,tops,anti,vis,low,rea,f,degree,bro,son,color,que;
int n=0,m=0,e=1,time=0,top=0,tail=0,hea=0;
bool view[400005];
inline int min(int q,int p)
fomu[505];
int n=0,m=0;
int f[505][2052],path[505][2052];
int code[105];
bool flag[505][2052];
int cmp(const void *p,const void *q)
void init()
else
fomu[i].sta=u;
for (scanf("%c",&ch);ch!='\n';scanf("%c",&ch))
}else
fomu[i].posine+=(1<>=1;
state>>=1;
}return 1;
}void dfs(int s,int state)
if (flag[s][state])
dfs(s-1,path[s][state]);
}bool infer(fomula a)
else
}return 1;
}int main()
}else
break;
}int tend=i-1,stmp=0,anss=0,anst=0;
delta=n-(fomu[tend].sta+10);
if (delta<0) delta=0;
for (nstate=0;nstate<=1<>=1)
code[i]=stmp&1;
dfs(tend,state);
for (i=tend+1;i<=m;i++)
if (infer(fomu[i]))
f[tend][state]++;
if (f[tend][state]>=f[tend][anss])
} }
memset(code,0,sizeof(code));
for (stmp=anst,i=fomu[tend].sta+11;i<=n;i++,stmp>>=1)
code[i]=stmp&1;
dfs(tend,anss);
for (i=1;i<=n;i++)
printf("%d\n",code[i]);
return 0;
}
code point 8:
#include#include#include#includeint e=1,n=0,m=0,nodesnum=0,top=0,tail=0,hea=0,bot=0;
int point[10005],li[10005],f[10005],attr[20005],head[10005],next[20005],link[20005],mych[10005],sta[10005],que[10005];
bool vis[10005];
void add(int u,int v,int e)
void init()
}else
attr[e]+=(1<<(u-thead));
}f[u]=thead;
last=u;
} add(point[lastlast],point[thead],e-1);
add(point[thead],point[lastlast],e);
}}bool find(int x)
} }
return 0;
}bool infer(int s)
void bfs(int s)
{ vis[s]=1;
sta[++tail]=s;
int ne=0,x=0,y=0;
while (top
提交答案題 WC2009 優化設計
很小,直接列舉。都是a b的形式,其中 a 和b xi或 x i 而且答案是全都可以滿足,標準的2 sat 也是a b 的形式,但是 a 和b xi1 xi2 可以使用一下分配律。第5組可以全部滿足,又是2 sat 第6組有3條不能滿足,列舉是哪三條顯然是不現實的,能不能貪心一下呢?我們一條一條地看...
WC命令詳解
通常利用linux的wc命令和其他命令結合來計算行和其他資訊。在linux下用wc進行計數。返回檔案的行數 字數 位元組數等。從乙個例子說起 看上面例子,檔案getpid example.c共有7行,看看利用wc命令對該檔案進行操作的效果。如下圖 其中7為行數,15為字數 最長行的字數,上圖中第5行...
wc命令詳解
基礎命令學習目錄首頁 linux系統中的wc word count 命令的功能為統計指定檔案中的位元組數 字數 行數,並將統計結果顯示輸出。1 命令格式 wc 選項 檔案.2 命令功能 統計指定檔案中的位元組數 字數 行數,並將統計結果顯示輸出。該命令統計指定檔案中的位元組數 字數 行數。如果沒有給...