2241. house

2241. house

題目描述

奶牛們想建立一個新的城市。它們想建立一條長度爲 Len 的主線大街,然後建立 K 條小街,每條小街的盡頭有一間房子(小街的其它位置沒有房子)。每條小街在主線大街的P_i 處分支, 小街的長度用L_i表示。FJ想知道最遠的兩個房子之間的距離是多少。

輸入

第 1 行: 兩個整數 Len 和K,意義如題目描述。
第2…K+1行: 每行兩個整數P_i和L_i,對應着一條小街的信息。

輸出

輸出共一行一個整數,即最遠的兩個房子之間的距離。

樣例輸入
【輸入樣例1】

5 4
5 6
2 2
0 3
2 7

【輸入樣例2】

5 4
2 4
2 2
2 10
2 7

樣例輸出
【輸出樣例1】

16

【輸出樣例2】

17

數據範圍限制
對於30%的數據: 1≤Len≤500;2≤K≤100;1≤L_i≤1,000;
對於60%的數據: 1≤Len≤5,000;2≤K≤5,000;1≤L_i≤1,000,000;
對於100%的數據:1≤Len≤100,000,000;2≤K≤500,000;0≤P_i≤Len;1≤L_i≤100,000,000;

提示
【樣例1解釋】主線大街長度是5,有4條小街,分別位於距離主線大街 0、2、 2、 5 處。這4條小街的長度分別是3、 2、 7、 6。注意:主線大街的同一個地點可以有多條小街;房子 #1 和房子 #4 的距離最遠,最遠距離是16。

60分:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
long long maxx,len,k,p[500010],l[500010];
void input()
{
	scanf("%lld%lld",&len,&k);
	for(int i=1;i<=k;i++) scanf("%lld%lld",&p[i],&l[i]);
}
int main()
{
	fre(house);
	input();
	for(int i=1;i<k;i++)
	for(int j=i+1;j<=k;j++)
		maxx=max(abs(p[i]-p[j])+l[i]+l[j],maxx);
	printf("%lld",maxx);
	return 0;
}

100分:
我們其實只是在60分的基礎上減掉了一些多餘的排列。
先講講做法吧!
設ans(i,j)表示選第i間房子和第j間房子的距離,其他出現的變量同60分做法。
普通的思路:
ans(i,j)=l[i]+l[j]+abs(p[i]-p[j]);
我們做一遍從小到大的排序:
即可去掉絕對值
ans(i,j)=l[i]+l[j]+p[i]-p[j];
然後合併一下:
ans(i,j)=l[i]+p[i]+(l[j]-p[j]);

最後的答案就等於max(ans(i,j));
要使答案最大,那麼ans(i,j)就要儘可能大。
然後就可以解決一些多餘的運算了。

解釋一下爲什麼
在這裏插入圖片描述
我們本來是,要選了紅點(右邊),那我們再用用其他點與它相加取max,但一定要這樣嗎,其實不用,我們看,如果再到了另一個紅點(左邊),然後如果都是選藍點,那肯定是選左邊的啦。那大家可能會有疑問,那我們要不要取紅點右邊的值,其實不用。因爲我們反過來思考就行了,大家仔細醞釀(有點dp的思想)。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
int max1,max2,len,k;
struct node
{
	int p,l;
} a[500010];
void input()
{
	scanf("%d%d",&len,&k);
	for(int i=1;i<=k;i++) scanf("%d%d",&a[i].p,&a[i].l);
}
bool cmp(node x,node y) {return x.p<y.p;}
int main()
{
	fre(house);
	input();
	sort(a+1,a+1+k,cmp);
	max2=a[1].l-a[1].p;
	for(int i=1;i<=k;i++)
	{
		max1=max(max2+a[i].p+a[i].l,max1);
		max2=max(max2,a[i].l-a[i].p);
	}
	printf("%d",max1);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章