洛谷P2827 NOIP2016 蚯蚓

2022-02-01 20:45:01 字數 3066 閱讀 8797

題目描述:

輸入

輸出

思路分析——70分寫法:

看到每次取出最大值,第一眼想到的就是優先佇列,我們可以每一次取完隊首元素後將其分開後兩段的長度進行計算,再放入佇列之中即可

但題目中要求,除被切開的蚯蚓外,其餘蚯蚓長度要變長,每次把隊中元素取出並加上q再放入隊中?不用說我們也知道這是不行的,那我們可以

考慮定義乙個tap來表示當前隊內蚯蚓的長度增加的總的長度,每次從隊首取出元素,給它加上tap,使它變為它應該的此時的長度,在計算為兩段之後將每一段的長度再減去tap的基礎上再減乙個q(因為其他數都加上了q,相當於隊外的元素減q),tap+=q,之後以此類推;之後按照要求輸出對應排名的蚯蚓長度即可。

附上**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int n=1e7+10;7

struct

qiuyin

12bool

operator

< (const qiuyin& a)const

15};

16int

n,m,q,u,v,t;

17 priority_queuep;

18int

main()

25double cnt=(double)u/(double

)v;26

int cnt1=t,cnt2=t; //

cnt1,2分別用於記錄當前操作到何值時需要輸出

27long

long tap=0;28

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

33int t=p.top().length+tap; p.pop(); //

復原隊首元素

34 tap+=q; //

更新tap

35int a=(double)t*cnt;

36 p.push(qiuyin(a-tap));p.push(qiuyin(t-a-tap)); //

加入隊中時要減tap 37}

38 printf("\n"

);39

for(int i=1;i<=m+n;++i)

44p.pop();45}

46return0;

47 }

view code

思路分析——100分寫法:

這道題之中先後插入隊中的元素隱含著單調性,我們設先後取出a,b兩個元素,由於大的先取,則必有a>=b,我們設題目中的計算切後長度的分數為p,則之後a分為a*p和a-a*p(即a*(1-p))兩部分,b分為b*p和b-b*p(即b*(1-p))兩部分,因為a>=b,則必有a*p>=b*p;a*(1-p)>=b*(1-p),我們開三個陣列,乙個儲存原陣列,sort一遍使它內部元素單調遞減(不嚴格),另兩個分別裝x*p和x-x*p,每次從隊首取元素時,比較三個陣列中首指標指向的元素中最大的乙個,將最大的取出(並將其首指標+1),分完之後再分別裝入兩個陣列(放在隊尾以保證首元素最大)中,之後按要求輸出即可(仿照70分寫法)。

附上**:

1 #include2 #include3 #include4

using

namespace

std;

5const

int n=1e7+10;6

intorigin[n],cut1[n],cut2[n];

7int

n,m,q,u,v,t;

8int temp=0;9

int front_o=1,front_c1=1,front_c2=1;//

front表示不同陣列的首指標,便於查詢陣列中z最大值。

10int top1,top2;//

用於向陣列中新增元素

11bool cmp(int a,int b)

14int seek_max()

20if(maxtop1)

24if(maxtop2)

28if(t==1) front_o++; //

彈出首元素

29else

if(t==2) front_c1++;

30else front_c2++;

31return

max;32}

33int

main()

39int cnt1=t,cnt2=t;

40 sort(origin+1,origin+1+n,cmp);

41for(int i=1;i<=m;++i)

47 temp+=q;

48int a=(double)max*cnt,b=max-a; //

類似70分寫法

49 cut1[++top1]=a-temp;cut2[++top2]=b-temp;50}

51 printf("\n"

);52

for(int i=1;i<=n+m;++i)58}

59 printf("\n"

);60

return0;

61 }

view code

洛谷P2827,NOIP2016 蚯蚓

傳送門 考慮優先佇列 但是蚯蚓的長度是變化的,如果每一次操作都修改所有蚯蚓的長度,必然超時.但是每一次所有蚯蚓中,只有被斬斷生成的兩個沒有 q,其它所有蚯蚓長度均 q.不難想到,用優先佇列 兩個值 len表示被壓入優先佇列時的長度,t表示被壓入優先佇列的時間,如果當前時間為i,那麼當前蚯蚓的實際長度...

洛谷P2827 NOIP2016 提高組 蚯蚓

題鏈 最長的蚯蚓被砍兩截之後,其餘的蚯蚓長度會增加,與其加其餘蚯蚓不如對這兩隻蚯蚓操作,可定義乙個buff表示其餘蚯蚓需要增加多少長度,當拿出最長的那只蚯蚓時,就需要加上buff,當然被剪斷的變成兩條就需要減去當前buff再壓入佇列,保證下次拿出來時加上buff是應有的長度 乙個佇列存原陣列,另外兩...

P2827 NOIP2016 提高組 佇列

題意 傳送門 p2827 noip2016 提高組 蚯蚓 題解容易想到使用二叉堆維護長度的最大值,由於每次新產生之外的蚯蚓長度都增加 q qq,而難以修改已經在堆中的元素,那麼對新產生的蚯蚓長度減 q qq,可以使長度的相互關係保持不變。時間複雜度 o m log n o m log n o mlo...