Codeforces Round #509 (Div. 2) C、D

C

题目连接:http://codeforces.com/problemset/problem/1041/C

思路:

这题看的别人的代码,真的很简洁,很神奇,大概意思就是:先判断天数,再输出天数

判断天数:

先排序

对于每个时间,求出来一定不能与之同一天时间数,最后总天数是前面所求得最大值

输出天数:我们已经确定了天数是k天,那么对于排好序的数组,越挨得近的越不可能同天(因为值相差小,可能不够d+1)所以我们按顺序给元素分配第1到k天循环,这样相邻的元素不同天(我们已经确定了天是k天,所以按这样贪心地分配,肯定可以保证一天内相邻的时间差>d)

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<string>
#include<cstring>
#define ll long long
using namespace std;
const int N=200005;
pair<int,int>a[N];
int ans[N];

int main(){
    int n,m,d;
    while(scanf("%d%d%d",&n,&m,&d)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d",&a[i].first);
            a[i].second=i;
        }
        sort(a,a+n);
        int k=0,r=0;
        for(int l=0;l<n;l++){
            while(r<n&&a[r].first-a[l].first<=d)r++;
            k=max(k,r-l);
        }
        printf("%d\n",k);
        for(int i=0;i<n;i++)ans[a[i].second]=i%k+1;
        for(int i=0;i<n-1;i++)printf("%d ",ans[i]);
        printf("%d\n",ans[n-1]);
    }
}

D

题目链接:http://codeforces.com/problemset/problem/1041/D

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
#include<string>
#include<cstring>
#define ll long long
using namespace std;
const int N=200005;
ll l[N],r[N];
int main(){
    int n,h;
    while(scanf("%d%d",&n,&h)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%lld%lld",&l[i],&r[i]);
        }
        ll ans=0,sum=0,j=0;
        for(int i=0;i<n;i++){
            while(j<n-1&&sum+l[j+1]-r[j]<h){
                sum+=l[j+1]-r[j];
                j++;
            }
            ans=max(ans,r[j]-l[i]+h-sum);
            sum-=l[i+1]-r[i];//这样用减的方式,可以更快地判断每个点对应的距离
        }
        printf("%lld\n",ans);
    }
}
/*
5 10
2 4
5 6
7 9
16 18
19 20
*/

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/82735031