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...