vijos1048 送給聖誕夜的賀卡

2021-07-29 11:22:51 字數 1591 閱讀 2096

vijos1048

表示不是很懂為什麼這個是七級題。。

這是一道不明複雜度的玄學搜尋題

大概是sigma(i,1,n)c(i,n)。。n<=50

然而實際上過所有資料30ms不到

這裡我們用鄰接表來存衝突關係

enm表示當前狀態該節點有多少個與其衝突的人

然後dfs下去

這就是樸素的思路

inline

void dfs(int x,int now)

if(!enm[x])

dfs(x+1,now);

}

然而顯然妥妥tle啊

那怎麼辦呢

大家多少應該了解過a*的f函式吧

大概就是說當前代價+未來最優代價

如果這個都比最優解要差了,直接剪枝

我們可以用後面所有的和來代表未來最優代價

if(now+sum[n]-sum[x-1]return;
這樣可以加速很多。。

樸素dfs tle4個點

加了這個剪枝 tle1個點

那麼如何繼續優化?

a*中的最優代價是不是越接近實際值,演算法越快?

我們並不能保證實際值,但是我們的字首和如果越小,就越接近實際值對吧

那我們對所有書寫質量排序,則後來得到的字首和最小

然後就非常玄學的過了….

沒排序的是這樣的=_=

玄學搜尋題就是這樣…

要注意,排序後的衝突關係的處理

我這裡是用了f陣列對映一下,其他方法當然也有

code:

#include

#include

#include

#include

#include

#include

#include

#define inf 1e9

#define ll long long

#define for(i,j,k) for(int i=j;i<=k;i++)

#define dow(i,j,k) for(int i=k;i>=j;i--)

using

namespace

std;

int ans,n,list[101][101],sum[101],enm[101],f[101];

struct node

a[101];

inline

bool cmp(node x,node y)

if(!enm[x])

dfs(x+1,now);

}int main()

for(i,1,n) sum[i]=sum[i-1]+a[i].v;

dfs(1,0);

printf("%d\n",ans);

}

vijos1048 送給聖誕夜的賀卡

題目 不看資料範圍一定想貪心系列 暴搜就可以了?然而不行 tle 於是考慮減枝 題目要求價值總和最大,就按大 小排序 就從最大的選 然而僅僅這樣複雜度不會降 需要配合字尾和食用 當發現目前已選 後面待選的總和 即都選 依然比目前答案要小時,不搜 因為已經按大小排過序了,搜到較大答案的時間靠前的可能性...

Vijos 1048 送給聖誕夜的賀卡(dfs)

描述 輸入格式 第一行乙個數n。第二行n個數,第i個數代表預選名單中第i號小精靈的書寫質量 均為非負整數 接下來有若干行,每行兩個不同的非負整數x和y,表示預選名單中第x號和第y號的小精靈曾經在賀卡書寫合作任務中發生過衝突。輸出格式 第一行乙個數s。樣例1樣例輸入1 3 4 2 5 1 2 copy...

vijos1049 送給聖誕夜的禮品

題目大意 順次給出m個置換,反覆使用這m個置換對初始序列進行操作,問k次置換後的序列。m 10,k 2 31。題目分析 先將m個置換所使用的矩陣合併起來,然後做t k m次。剩下的k m次模擬即可。include include include include include include inc...