題目要求
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 [ai, bi] 裡至少有 ci 個點
input
輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 <= n <= 50000, 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1。c是點的個數。
output
輸出乙個整數表示最少選取的點的個數
sample input
53 7 3
8 10 3
6 8 1
1 3 1
10 11 1
sample output
6求解思路
使用差分約束的方法做。
**
#include
#include
#include
#define inf -1e8
using
namespace std;
struct edge};
//鏈式前向星
long
long head[
50054];
edge edge[
5000020];
long
long tot =0;
void
addedge
(long
long u,
long
long v,
long
long w)
long
long n;
long
long dis[
50054];
long
long pre[
50054];
long
long cnt[
50054];
long
long arrive[
50054];
void
spfa
(long
long s)
dis[s]=0
; arrive[s]=1
; queue<
long
long
> q;
q.push
(s);
while
(!q.
empty()
) dis[edge[i]
.v]= dis[edge[i]
.u]+ edge[i]
.w;// cout << "dis[v]=" << dis[edge[i].v]<<"v="<< edge[i].v;
// pre[edge[i].v] = edge[i].u;if(
!arrive[edge[i]
.v])}}
}}intmain()
long
long maxb =0;
for(
long
long i =
50052
; i >-5
; i--
)for
(long
long i =
0; i < n; i++
)spfa(0
);printf
("%lld"
, dis[maxb]);
//cout << maxb;
}
差分不等式
d i 1 d i 0 對於每個好感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 對於每個反感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 寫成我們約定的形式 d i d i 1 0 d j d i k d i d j k 1.對於差分不等...
差分約束 區間選點
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci bi ai 1...
區間選點 差分約束系統問題
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點。輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci bi ai 1...