送禮物 題解

2022-05-22 20:03:11 字數 1896 閱讀 7090

這道題目是到毒瘤題。

首先我們至少去l個,所以我們可以把小於l的用單調佇列直接求出。

對取l~r個。顯而易見的是左右兩端必分別是這個區間的最小值和最大值。我們可以用01分數規劃。不放令結果最後為ans,則有:

(a[j]-ans*j)-(a[i]-ans*i)>ans*k

所以我們就可以愉快地分數規劃啦。

**:

#include#include#include#include#include#include#define maxa 50005

#define me(a) memset(a,0,sizeof(a))

using namespace std;

const double eps=1e-6;

inline void read(int &x)

while(c<='9'&&c>='0')

return ;

}inline int read()

while(c<='9'&&c>='0')

return x;

}inline void w1(int x)

return ;

}inline void write(int x)

int n,k,l,r;

int a[maxa];

double ans=0;

deque q1,q2;//min,max

void find()

while(!q1.empty())q1.pop_back();

while(!q2.empty())q2.pop_back();

return ;

}//(a[j]-ans*j)-(a[i]-ans*i)>ans*k

double f(double x)

return ans; }

bool check(double x)

for(int i=1;i<=(n>>1);i++)swap(a[i],a[n-i+1]);

return false;

}void clear()

int main()

while(c<='

9'&&c>='0'

)

return;}

inline

intread()

while(c<='

9'&&c>='0'

)

returnx;}

inline

void w1(int

x)

return;}

inline

void write(int

x)int

n,k,l,r;

inta[maxa];

double ans=0

;deque

q1,q2;//

min,max

void

find()

while(!q1.empty())q1.pop_back();

while(!q2.empty())q2.pop_back();

return;}

//(a[j]-ans*j)-(a[i]-ans*i)>ans*k

double f(double

x)

return

ans;

}bool check(double

x)

for(int i=1;i<=(n>>1);i++)swap(a[i],a[n-i+1

]);

return

false;}

void

clear()

intmain()

printf(

"%.4lf\n

",mid);

}return0;

}

題解 JSOI2015 送禮物

首先我們得先知道乙個小結論,就是說如果最優方案中最大值和最小值必定是在區間兩端 要麼就是這兩個數在長度為 l 的區間中 那麼我們用 st表處理出長度為 l 的區間中最優的答案 接下來處理兩個數在區間首尾的方案 假設區間右端是最大值,左端是最小值 左端最大右端最小把陣列 reverse 一下就行 考慮...

swift送禮物動畫

最近做了乙個用swift寫的送禮動畫,這個動畫本來是在專案中用到的,然後專案改了需求用不上了就想到用swift封裝一下以後如果用得到可以借鑑下。想看下效果圖 思路 1.首先建立乙個動畫的資料model。struct animationmodel iflet giftname dict giftnam...

送禮物 雙向dfs

思路 dfs 先把a陣列排序,由大變小 dfs出前n 2 2 可以湊出的數,放到陣列s中 把s陣列去重排序,行成乙個單調遞增序列 再dfs剩下的數 可以組成的數,每組成乙個,二分找s陣列匹配的最大值 include includeusing namespace std typedef long lo...