給定乙個數軸上的 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 需要識別這個題目給出的是 魔咒 還是對應功能,並寫出轉換的結果,如果在魔咒詞典裡找不到,輸出 ...