小學數學題 洛谷p2921

2021-08-08 16:21:58 字數 3341 閱讀 4578

露公尺婭:我來先考你一道小學數學題吧!

琪露諾:好!小學的題我肯定都會!

露公尺婭:有 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,

m​1​

​,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 1

1 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​​=

m​2​

​=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​​,

m​2​

​≤50

,r≤109 r \leq 10^9 r≤

10​9

​​請不要相信洛谷評測機的速度,如果得了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 剛剛那個式子變為 這...