WC 2009 opt 優化設計

2021-06-04 05:05:36 字數 2743 閱讀 1818

這個題其實就是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 命令功能 統計指定檔案中的位元組數 字數 行數,並將統計結果顯示輸出。該命令統計指定檔案中的位元組數 字數 行數。如果沒有給...