Cod sursa(job #2497904)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 23 noiembrie 2019 12:08:54
Problema Critice Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#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;
}