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;
}