做这样的小题最适合我,普及-:)
poj读不懂原文,只好抄抄抄了,所以抄完题意,代码也一起抄啦!
/*
农夫想要在第D天的时候剩下F2千克的草,而他一共有F1千克的草,如果他将草投放到农场就会有牛来吃草,所以他想知道在第几天的时候放他的F1千克的草料到农场上,才能让他的草料在第D天的时候剩下F2千克
Input
第一行为四个整数C,F1,F2,D分别表示牛的数量,农夫拥有的草的数量,农夫在第D天剩余草的数量和天数D,之后C行每行两个整数表示该头牛在农场上出现的时间段
Output
输出农夫放草料的时期
---------------------
原文:https://blog.csdn.net/v5zsq/article/details/46833687
版权声明:本文为博主原创文章,转载请附上博文链接!
*/
#include <iostream>
#include <cstdio>
using namespace std;
int n,l,r,d,mx,k,s,x,y;
int sum[2005];
int work() {
cin>>n>>r>>l>>d;
for(int i=1; i<=n; i++) {
scanf("%d%d",&x,&y);
sum[x]++,sum[y+1]--;
}
s=r-l;
for(int i=1; i<=d; i++)
sum[i]+=sum[i-1];
for(int i=d; i>=1; i--) {
s-=sum[i];
if(s==0)return i;
}
}
int main() {
cout<<work()<<endl;
return 0;
}
洛谷2879,最开始一看跟车站分级差不多啊,可以拓扑,但是n^2的时间复杂度。又想差分可以,第一遍没有处理可能重复的数据,第一次50分,处理完重复就ac了,车站分级是不是也可以这么写。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int N=1e4+1;
int n ,l,r,m,d[N],s=0;
bool map[N][N];
int main(){
int x,y;
scanf("%d%d%d%d",&n,&l,&r,&m);
for(int i=1;i<=m;i++) {
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);
if(map[x][y])continue;
map[x][y]=1;
d[x+1]-=1;
d[y]+=1;
}
for(int i=1;i<=n;i++){
s+=d[i];
printf("%d\n",r+s);
}
}