給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 [ai, bi] 裡至少有 ci 個點
使用差分約束系統的解法解決這道題
input
輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 <= n <= 50000, 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1。
output
輸出乙個整數表示最少選取的點的個數
sample input
53 7 3
8 10 3
6 8 1
1 3 1
10 11 1
sample output
6解題思路:
設dis[x]為0到x的所有在集合中點的個數
並且對於後面的每一點,相對於前面乙個點,要麼選,要麼不選。
dis[ai - 1] <= dis[bi] - ci
dis[i] <= dis[i - 1] + 1
dis[i - 1] <= dis[i]
可將s[x]視為各點到源點的距離,當上述任一一條不滿足時,進行鬆弛操作。即bellman-ford演算法。
最後用最大右區間到源點的距離減去最小左區間到源點的距離即為答案。
#include
#include
#include
using
namespace std;
const
int inf=
55000
;class
inter[
50005];
int n;
//區間數
int maxup;
//最大右區間邊界
int mindo;
//最小左區間邊界
int dis[
50005];
//源點到各點的距離
int c[
50005];
int k,i;
intmain()
bool flag=
true
;while
(flag)
}for
(i=mindo;ifor(i=maxup-
1;i>=mindo;i--)}
}printf
("%d\n"
,dis[maxup]
-dis[mindo]);
}return0;
}
Week8作業 A 區間選點II
問題描述 給定乙個數軸上的n個區間,要求在數軸上選取最少的點使得第i個區間 ai,bi 裡至少有ci個點。1 n 50000,0 ai bi 50000,1 ci bi ai 1。差分約束系統求解 結論 1.如果要求取最小值,則求最長路,將不等式全部化成xi xj k的形式,這樣建立j i的邊,權值...
Week 8 作業A 區間選點II
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點。輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci bi ai 1...
程式設計思維 week8 作業A 區間選點 II
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 5000...