露公尺婭:我來先考你一道小學數學題吧!
琪露諾:好!小學的題我肯定都會!
露公尺婭:有 n n
n 只妖精要跨過霧之湖,由於湖邊大霧瀰漫,妖精們看不清湖到底有多大,不想從邊上繞過去。
湖上有一條船個傳送器,且這個傳送器每次只能載 r r
r 只妖精跨過湖面(注意傳送器可以同時把兩側的妖精分別運到對岸,但每次運送的總妖精數不能超過 r r
r )。
這些妖精還很喜歡搞事,所以在任何時刻,都需要滿足一些條件,其中第一種條件有 m1 m_1m
1 個,第二種條件有 m2 m_2 m
2 個。
第一種條件形如 妖精 a a
a 和妖精 b b
b 必須要在湖的同一側;
第二種條件形如 當妖精 a a
a 在湖的一側時,妖精 b b
b 和妖精 c c
c 不能同時在湖的另一側。
現在給出這些條件,求:
至少需要傳送器幾次才能讓所有妖精到湖的對岸
在保證次數最少的前提下,求過河方案數
輸入格式:
第一行四個整數 n,m1,m2,r n , m_1 , m_2 , rn,
m1
,m
2,
r接下來 m1 m_1 m
1 行每行2個整數 a,b a , b a,
b,代表第一種條件
接下來 m2 m_2 m
2 行每行3個整數 a,b,c a , b , c a,
b,c, 代表第二種條件
輸出格式:
兩個整數,分別為最少使用傳送器次數和方案數,用空格分隔
若無法全部過河,輸出"-1 0"(不含引號)
輸入樣例#1:
1 0 0 1
輸出樣例#1:
1 1
輸入樣例#2:
5 0 0 2
輸出樣例#2:
3 90
輸入樣例#3:
3 1 0 11 2
輸出樣例#3:
-1 0
對於 30% 30 \% 30
% 的資料, n≤10 n \leq 10 n≤
10對於另外 10% 10 \% 10
% 的資料, m1=m2=0 m_1 = m_2 = 0 m
1=
m2
=0對於 100% 100 \% 10
0%的資料, a,b,c≤n≤15 a,b,c \leq n \leq 15a,
b,c≤
n≤15
,m1,m2≤50 m_1 , m_2 \leq 50 m
1,
m2
≤50
,r≤109 r \leq 10^9 r≤
109
請不要相信洛谷評測機的速度,如果得了80分以上,可以等人少的時候再交一次。但如果得了60分以下,說明可能寫的不是正解,就不要再虐萌萌噠評測機啦
解法一:先預處理出所有合法的狀態和運算元量<=r的所有操作,然後bfs即可。
#include#include#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int maxn=55;
int n,m1,m2,r,ma[maxn],mb[maxn],ma[maxn],mb[maxn],mc[maxn];
bool g[1<<16];
int ch[1<<15],sum,ukn[1<<15];
int q[1<<16],head,tail,vis[1<<16],num[1<<16],ans[1<<16],flag;
inline bool pd(int sta)
} f(i,1,m2)
} return 1;
}inline void dfs(int cur,int res,int sta)
ukn[sta]=1;
return;
} if(res<=r) dfs(cur+1,res+1,sta|(1<<(cur-1)));
dfs(cur+1,res,sta);
}inline void bfs()
f(i,1,m2)
f(i,0,(1<
優化建圖
新建節點(i,j,k)表示與狀態i 後j位完全相同 且 剩餘位置上差異恰有k位
從(i,j,k)向(i,j-1,k)和(i^(1<<(j-1)),j-1,k+1)連一條權值為0的邊
再從(i,0,k)向(i,n,0)連一條權值為1的邊(0<=k<=r)
最後從((1《再在新圖上跑bfs+dp
時間複雜度o((n^2)*(2^n))
#include#include#include#includeusing namespace std;
const int maxn=10000010;
inline int hash(const int &a,const int &b,const int &c)
struct edge
*h[maxn],pool[maxn*2];
int top;
inline void addedge(int u,int v,bool w)
queueq;
int dis[maxn];
int cnt[maxn];
int n,m1,m2,r,s,t;
//m1:形如(a和b必須在一邊)的限制
//m2:形如(a不在時b和c不能在一邊)的限制
int rule1[51],rule2a[51],rule2b[51];
inline bool isvalid(int state)
for(int i=1; i<=m2; ++i)
else
}return true;
}int main()
for(int i=1; i<=m2; ++i)
//for(int i=0;i<1if(dis[tmp->v]==dis[u]+tmp->w)cnt[tmp->v]=cnt[tmp->v]+cnt[u];}}
printf("%d %d\n",dis[t],cnt[t]);
return 0;
}
Tarjan模板 洛谷P2921
傳送門 上 先佔坑,我去打打noip2018 滑稽 好了好了回來了,noip太難了,做不動。tarjan是用來求強連通分量的演算法。應用十分廣泛。tarjan演算法就不證明了,有興趣的可以去網上看大神們的各種證明。主要是我也不會證明啊 隨便講講tarjan怎麼寫的吧。low和dfn是最重要的兩個陣列...
小學數學題
小學數學題1 usetyp 1 目標 擷取字串usetyp 注意,usetyp的長度是可變的 問題 求以上字串usetyp的長度 注意usetyp的長度是不固定 設usetyp的長度 p 已知1 號的索引位置x indexof 已知理論2 字串長度 最大索引 1 所以,p x 1 3 p x 2 所...
洛谷比賽數學題 1
zlh秒的題,我根本不會,出題人欽點此題提高 想來我要爆零了。題面 這題n,a都巨大無比,所以演算法要盡量往k身上靠,先推一波式子 把這裡sigma內的東西拆開得到 第k此項係數c k,k 肯定是1,消去,再換一下i,j列舉順序 這裡就出現了和原式很相似的東西,設乙個二元函式a 剛剛那個式子變為 這...