BZOJ4368 boxes紀念品盒

2022-03-31 14:43:58 字數 1202 閱讀 9532

目錄題目傳送門

一道比較妙的題目。我們發現送紀念品的走法只有三種:

1.往左邊走,往左邊回

2.往右邊走,往右邊回

3.繞一圈

然後我們可以簡單的證明出來第三種的操作不會多於一次,因為如果多於一次的話,說明紀念品的個數\(\geq k\)個,就會被一次1或者2加上一次3這個方法替代,並且會更優。所以我們就可以將所有的隊伍所在的位置從中間開始劃分,分為左半部分和右半部分。我們會發現繞一圈所需要發紀念品的點一定是左半部分最靠右的一部分點與右半部分最靠左的一部分點,因為這樣會使1和2的操作更加優。於是我們列舉左邊一半部分用1操作送了幾個紀念品,然後每次更新答案即可。

#include using namespace std;

typedef long long ll;

bool finish_read;

templateinline void read(t &x)while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;finish_read=1;}

templateinline void print(t x)

templateinline void writeln(t x)

templateinline void write(t x)

/****************=header template**********====*/

const int maxn=1e7+500;

int n,k,l;

int pos1,pos2;

int p[maxn];

ll f1[maxn],f2[maxn];

int st1[maxn],st2[maxn];

/****************===define area***************=*/

int main()

for(int i=1;i<=pos2/2;i++) swap(st2[i],st2[pos2-i+1]);

for(int i=1;i<=pos1;i++)

for(int i=1;i<=pos2;i++)

ll ans=2*(f1[pos1]+f2[pos2]);

for(int i=pos1-k;i<=pos1;i++)

printf("%lld\n",ans);

return 0;

}

紀念品分組

問題描述 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值 相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時 間內發完所有紀念品,樂樂希望分組的數目最少。你的任務...

紀念品分組

time limit 1 sec memory limit 128 mb submit 4 solved 2 submit status web board 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但...

紀念品分組

題目描述 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是...