這個題目難度非常大,首先對於老師的一種方案,應用分數規劃的一般做法,求出所有的c=t-rate*p,如果沒有選擇的c值中的最大值比選擇了的c值中的最小值大,那麼這個解是可以改進的。
那麼問題就轉化成了怎麼求最小的c和最大的c。
t-rate*p 求這種型別的最值,並且rate是單調的,那麼就可以考慮利用斜率優化的那種辦法來維護決策點。
考慮兩個決策點,得到ti-tj>rate(pi-pj) 但是這個pi pj的大小不能確定,我們知道可以利用斜率優化的問題不僅僅要rate單調,還需要pi 單調 這個時候我們需要利用題目中的條件,題目中保證了t/p單調,根據這個條件,可以推出求兩種最值的時候都只有單調的p才是有可能成為決策點的。那麼就可以按照斜率優化步驟來解題了。乙個是用單調棧維護,另外乙個利用單調佇列維護。
#include #include #include #include using namespace std;
const int maxn=5e4+9;
double high[maxn],low[maxn];
long long sumt[maxn],sump[maxn];
struct d
}test[maxn];
int que[maxn];
bool chk(int i,int j,int t,int s)
bool chk2(int i,int j,long long t,long long p)
int main()
int front=1,end=0;
for(int i=1;i<=n;i++)
int ans=0;
for(int i=1;ilow[i])
ans++;
cout<=1;i--)
if(high[i+1]>low[i])
printf("%d\n",n-i);
}return 0;
}
poj3273 poj3258 二分答案
二分答案的方法比較常用,思想比較簡單,就是從結果出發解決問題,已知答案在某乙個區間中,並且根據某種判定條件,能夠確定當前所選的值是大了還是小了,我們通過二分的方法將其找出來,從而降低時間複雜度。當然,這個判定條件就是二分答案的關鍵啦。通常,判定函式是乙個貪心演算法。二分答案的方法通常用來解決最小值最...
POJ 1716 差分約束
include include include include include include include include using namespace std define print x cout define input x cin x define inf 1 30 define si...
poj 1201 差分約束
傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...