Pagini recente » Cod sursa (job #2527918) | Cod sursa (job #457665) | Cod sursa (job #2649827) | Cod sursa (job #2580123) | Cod sursa (job #2497904)
#include <iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int M=100005;
int dpjos[M],dpsus[M];
const int N=85;
int x[N];
int s[N];
int main()
{
int n,m,mini=1,maxi=1;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&s[i]);
if(x[i]+s[i]>x[maxi]+s[maxi])
maxi=i;
if(x[i]-s[i]<x[mini]-s[mini])
mini=i;
}
int cost=0;
cost+=m-(min(x[maxi]+s[maxi],m));
s[maxi]=max(s[maxi],m-x[maxi]);
cost+=(max(x[mini]-s[mini]-1,0));
s[mini]=max(s[mini],x[mini]-1);
for(int i=1;i<=m;i++){
dpjos[i]=1<<30;
for(int j=1;j<=n;j++){
if(x[j]<=i){
if(x[j]+s[j]>=i){
dpjos[i]=min(dpjos[i],dpjos[max(x[j]-s[j]-1,0)]);
}
else{
dpjos[i]=min(dpjos[i],i-x[j]-s[j]+dpjos[max(0,x[j]-(i-x[j])-1)]);
}
}
}
}
for(int i=m;i>=0;i--){
dpsus[i]=1<<30;
for(int j=1;j<=n;j++){
if(x[j]>i){
if(x[j]-s[j]<=i){
dpsus[i]=min(dpsus[i],dpsus[min(x[j]+s[j]+1,m+1)]);
}
else{
dpsus[i]=min(dpsus[i],x[j]-i-s[j]+dpsus[min(m+1,x[j]+(x[j]-i)+1)]);
}
}
}
}
int cmin=1<<30;
for(int i=0;i<=m;i++){
cmin=min(cost+dpjos[i]+dpsus[i],cmin);
}
printf("%d",cmin);
return 0;
}