codeforces949D Curfew

題面

題意

一條直線上有n個寢室,每個寢室中有aia_i個人,現在有兩個宿管分別從左右兩邊向中間走,每個單位的時間查一個寢室,若人數不足b個,則會記錄,最中間的寢室歸左邊的宿管,現在每個人每個單位的時間可以跑d個寢室,則兩個宿管記錄下的寢室數量的較大值的最小值是多少。

做法

這題有一個很棒的貪心,可以從左向右掃(直到中間),如果可以到達這個寢室的人數(在宿管來之前)大於等於b,就讓這些人過來,反之不過來且答案++,然後再倒着做一遍相同的事,兩個答案中的較大值即爲答案。
可以發現,中間的人向左走似乎會讓右邊的答案不優,但是可以發現,中間的人向左走的前提是左邊的人數不夠,也就是右邊的人數有多,因此答案不會變劣。

代碼

#include<bits/stdc++.h>
#define N 100100
using namespace std;

int n,d,b,num[N],A,B,sum;

int main()
{
    int i,j;
    cin>>n>>d>>b;
    for(i=1;i<=n;i++) scanf("%d",&num[i]);
    for(i=j=1;i<=(n+1)/2;i++)
    {
		for(;j<=min(i*(d+1),n);j++) sum+=num[j];
		if(sum<b) A++;
		else sum-=b;
    }
    reverse(num+1,num+n+1);
    sum=0;
    for(i=j=1;i<=n/2;i++)
    {
		for(;j<=min(i*(d+1),n);j++) sum+=num[j];
		if(sum<b) B++;
		else sum-=b;
    }
    cout<<max(A,B);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章