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
*/