山東大學程式設計第八周作業

2021-10-05 04:02:00 字數 4262 閱讀 9979

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 [ai, bi] 裡至少有 ci 個點

使用差分約束系統的解法解決這道題

input

輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 <= n <= 50000, 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1。

output

輸出乙個整數表示最少選取的點的個數

example該題用差分約束求解要考慮構造不等式組,sum[i] 表示數軸上 [0, i] 之間選點的個數,那麼對於第 i 個區間 [ai,bi] 需要滿足:

(1)sum[bi]-sum[ai-1]>=ci

而且第i個點選擇為0,不選為1,所以有:

(2)0<=sum[i]-sum[i-1]<=1

因為要求差分約束系統的最小解,所以需要轉化為 ≥ 不等式組從min來跑spfa最長路

答案為dis[max(bi)+1]

#include

#include

#include

#include

using

namespace std;

#define lmt -1e9

struct edge edge[

1000010];

int head[

50010

], num;

int n,a,b,c,min,max,dis[

50010];

bool vis[

50010];

queue<

int> que;

void

add(

int x,

int y,

int w)

intget_m

(int o,

int a,

int b)

else

}void

spfa()

}}}}

intmain()

max++

; min++

;for

(int i = min; i <= max; i++

)spfa()

; cout << dis[max]

<< endl;

return0;

}

眾所周知, tt 是一位重度愛貓人士,他有乙隻神奇的魔法貓。

有一天,tt 在 b 站上**貓貓的比賽。一共有 n 只貓貓,編號依次為1,2,3,…,n進行比賽。比賽結束後,up 主會為所有的貓貓從前到後依次排名並發放愛吃的小魚幹。不幸的是,此時 tt 的電子裝置遭到了宇宙射線的降智打擊,一下子都連不上網了,自然也看不到最後的頒獎典禮。

不幸中的萬幸,tt 的魔法貓將每場比賽的結果都記錄了下來,現在他想程式設計序確定字典序最小的名次序列,請你幫幫他。

輸入有若干組,每組中的第一行為二個數n(1<=n<=500),m;其中n表示貓貓的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即編號為 p1 的貓貓贏了編號為 p2 的貓貓。

給出乙個符合要求的排名。輸出時貓貓的編號之間有空格,最後一名後面沒有空格!

其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。

example典型的拓撲排序問題,每次找到入度為0的點,拿出,然後將該點到達的點的入度減一,繼續該過程即可。

#include

#include

using

namespace std;

int a[

510]

[510

], in[

510]

;int n, m,cnt;

intmain()

}for

(int i =

1; i <= n; i++

)for

(int j =

1; j <= n; j++)}

}return0;

}

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?

本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0 對於每組資料,第一行輸出 「case x: 」,x 表示資料的編號,從1開始,緊跟著是最高的票數。 接下來一行輸出得票最多的同學的編號,用空格隔開,不忽略行末空格!

example乙個人得票即其入度,考慮到可能存在的強連通分量,我們要用到kosaraju演算法,然後縮點成為無環圖。

那麼入度我們可以人為的分為兩部分:當前scc內的點的個數-1,還有其他可達該點的scc中的點,最後我們發現答案一定在出度為0的scc中,我們找到其中的最大值即可。

#include

#include

#include

#include

using

namespace std;

int back_index,scc_num,cnt,n,m;

vector<

int>g1[

5010

],g2[

5010

],g3[

5010];

int scc[

5010

],dfn[

5010

],scc_index[

5010

],in[

5010

],ans[

5010];

bool vis[

5010];

void

dfs1

(int x)

dfn[back_index++

]=x;

//後序序列

}void

dfs2

(int x)

//反圖

void

dfs3

(int x)

intmain()

for(

int i=

1;i<=m;i++

)memset

(vis,0,

sizeof

(vis));

//求強連通分量

memset

(scc_index,0,

sizeof

(scc_index));

memset

(scc,0,

sizeof

(scc));

memset

(dfn,0,

sizeof

(dfn));

back_index=scc_num=0;

for(

int i=

0;i)//原圖if(

!vis[i]

)dfs1

(i);

for(

int i=n-

1;i>=

0;i--

)//反圖if(

!scc_index[dfn[i]])

scc_num++

,dfs2

(dfn[i]);

//scc_index[i]表示i所在的scc編號

for(

int i=

0;i)//縮點

}for

(int i=

1;i<=scc_num;i++

)//記錄入度

for(

int j=

0;j.size()

;j++

) in[g3[i]

[j]]++;

memset

(ans,0,

sizeof

(ans));

int mx=0;

for(

int i=

1;i<=scc_num;i++

)//用ans來記錄每個點可以到達的點數if(

!in[i]

)//入度為0的點

cout<<

"case"

<<

' '<": "

for(

int i=

0;icout

}

山東大學程式設計第二週作業

東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。輸出若干行,表示從左上...

山東大學程式設計第十周作業

東東在玩遊戲 game23 在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出 1。input 輸入的唯一一行包括兩個整數n和m 1 n m 5 10 8 output 輸出從n轉換到m的操作次...

山東大學程式設計思維作業15

zjm 為了準備霍格沃茲的期末考試,決心背魔咒詞典,一舉拿下咒語翻譯題 題庫格式 魔咒 對應功能 背完題庫後,zjm 開始刷題,現共有 n 道題,每道題給出乙個字串,可能是 魔咒 也可能是對應功能 zjm 需要識別這個題目給出的是 魔咒 還是對應功能,並寫出轉換的結果,如果在魔咒詞典裡找不到,輸出 ...