B. Kefa and Company
2015-09-28 15:45
211 查看
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Kefa wants to celebrate his first big salary by going to restaurant. However, he needs company.
Kefa has n friends, each friend will agree to go to the restaurant if Kefa asks. Each friend is characterized by the amount of money
he has and the friendship factor in respect to Kefa. The parrot doesn't want any friend to feel poor compared to somebody else in the company (Kefa doesn't count). A friend feels poor if in the company there is someone who has at least d units
of money more than he does. Also, Kefa wants the total friendship factor of the members of the company to be maximum. Help him invite an optimal company!
Input
The first line of the input contains two space-separated integers, n and d (1 ≤ n ≤ 105,
![](http://codeforces.com/predownloaded/1a/e4/1ae48a19254167100a31cc359b7286e5912c0617.png)
)
— the number of Kefa's friends and the minimum difference between the amount of money in order to feel poor, respectively.
Next n lines contain the descriptions of Kefa's friends, the (i + 1)-th
line contains the description of the i-th friend of type mi, si (0 ≤ mi, si ≤ 109)
— the amount of money and the friendship factor, respectively.
Output
Print the maximum total friendship factir that can be reached.
Sample test(s)
input
output
input
output
Note
In the first sample test the most profitable strategy is to form a company from only the second friend. At all other variants the total degree of friendship will be worse.
In the second sample test we can take all the friends.
解题说明:此题是求某个区间范围内的数,并让该数对应的值和最大。可以采用先排序,然后遍历的做法,在遍历过程中统计出每个区间中的最大值,最后得到一个全局的最大值。
#include<stdio.h>
#include <string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,a,b,x,d;
int main()
{
cin>>n>>d;
pair<int,int>p[100005];
for(int i=0;i<n;++i)
{
cin>>p[i].first>>p[i].second;
}
sort(p,p+n);
long long ans=0,cur=0,st=0;
for(int i=0;i<n;)
{
if(p[i].first-p[st].first>=d)
{
cur-=p[st].second;
++st;
}
else
{
cur+=p[i].second;
++i;
}
ans=max(ans,cur);
}
cout<<ans<<endl;
return 0;
}
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Kefa wants to celebrate his first big salary by going to restaurant. However, he needs company.
Kefa has n friends, each friend will agree to go to the restaurant if Kefa asks. Each friend is characterized by the amount of money
he has and the friendship factor in respect to Kefa. The parrot doesn't want any friend to feel poor compared to somebody else in the company (Kefa doesn't count). A friend feels poor if in the company there is someone who has at least d units
of money more than he does. Also, Kefa wants the total friendship factor of the members of the company to be maximum. Help him invite an optimal company!
Input
The first line of the input contains two space-separated integers, n and d (1 ≤ n ≤ 105,
![](http://codeforces.com/predownloaded/1a/e4/1ae48a19254167100a31cc359b7286e5912c0617.png)
)
— the number of Kefa's friends and the minimum difference between the amount of money in order to feel poor, respectively.
Next n lines contain the descriptions of Kefa's friends, the (i + 1)-th
line contains the description of the i-th friend of type mi, si (0 ≤ mi, si ≤ 109)
— the amount of money and the friendship factor, respectively.
Output
Print the maximum total friendship factir that can be reached.
Sample test(s)
input
4 5 75 5 0 100 150 20 75 1
output
100
input
5 1000 7
11 32
99 10
46 8
87 54
output
111
Note
In the first sample test the most profitable strategy is to form a company from only the second friend. At all other variants the total degree of friendship will be worse.
In the second sample test we can take all the friends.
解题说明:此题是求某个区间范围内的数,并让该数对应的值和最大。可以采用先排序,然后遍历的做法,在遍历过程中统计出每个区间中的最大值,最后得到一个全局的最大值。
#include<stdio.h>
#include <string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,a,b,x,d;
int main()
{
cin>>n>>d;
pair<int,int>p[100005];
for(int i=0;i<n;++i)
{
cin>>p[i].first>>p[i].second;
}
sort(p,p+n);
long long ans=0,cur=0,st=0;
for(int i=0;i<n;)
{
if(p[i].first-p[st].first>=d)
{
cur-=p[st].second;
++st;
}
else
{
cur+=p[i].second;
++i;
}
ans=max(ans,cur);
}
cout<<ans<<endl;
return 0;
}
相关文章推荐
- 如何计算网络地址和广播地址
- ubuntu 安装 Mongodb
- ASP.NET中的几种弹出框提示基本实现方法
- Swift 2.0关键字guard
- 新浪微博的账号登录及api操作
- ADO.NET中的五个主要对象
- AWS EC2服务器的HTTPS负载均衡器配置过程
- python入门之(if、for等)
- mac 64位 安装wxpython后报错解决方法
- 杭电acm4510
- google的levelDB实现原理分析
- C++之char , signed char , unsigned char
- spark--案例分享--性别预测
- 【CSS】兼容IE6的卡片式布局
- AWS EC2服务器的HTTPS负载均衡器配置过程
- 更改ubuntu默认文件管理器为pcmanfm
- C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
- MFC多文档设置窗口大小
- Android开发读取assert下的txt文件
- php implode()函数