贴一个队友写的代码
23333
手动滑稽
---------------------------------------------------------------
其实这题挺水,首先预处理,,使每个点的数目小于他能带的最大的数目 ((因为某个点的数目大于他能带的最大值的话,这个点至少要单独跑 几 趟的
剩下的那些 分别从两边贪心处理,每次尽量带满 他能带的 max 值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <cctype>
#include <stack>
#include <sstream>
#include <list>
#include <map>
#include <assert.h>
#define debug() puts("************")
#define MS(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> P;
const int INF = 0x3f3f3f3f;
const double inf = 1e20;
const double PI = 3.1415926535;
const double eps = 1e-9;
const LL mod = 1e9+7;
const int dx[] = {-1,0,1,0};
const int dy[] = {0,1,0,-1};
#define maxn 1100
struct node
{
LL pos;
LL va;
};
node fu[maxn];
node zh[maxn];
LL n,k;
bool cmp(node a,node b)
{
return a.pos>b.pos;
}
bool cmp1(node a,node b)
{
return a.pos<b.pos;
}
int main()
{
ios::sync_with_stdio(0);
cin>>n>>k;
LL cnt=0;
LL sum=0;
LL ans=0;
for (int i=0;i<n;i++)
{
LL p,va;
cin>>p>>va;
LL t = va / k;
sum += (t*2*abs(p));
if (p<0)
{
node ac;
ac.pos=p;
ac.va=va%k;
if (ac.va==0)
{
continue;
}
fu[cnt++]=ac;
}
else
{
node ac;
ac.pos=p;
ac.va=va%k;//cout<<ac.va<<endl;
if (ac.va==0)
{
continue;
}
zh[ans++]=ac;
}
}
//cout<<"sum +++"<<sum<<endl;
sort(zh,zh+ans,cmp);
sort(fu,fu+cnt,cmp1);
LL res=0;
int flag=0;
LL po;
for (int i=0;i<ans;i++)
{
//cout<<"va : "<<zh[i].pos<<endl;
if (res+zh[i].va<=k)
{
//debug();
if (!flag)
{
flag=1;
po=zh[i].pos;
//cout<<"po :: "<<po<<endl;
//debug();
}
res+=zh[i].va;
//cout<<"re ++"<<res<<" "<<pos<<endl;
}
else
{
zh[i].va-=(k-res);
//cout<<"zh :"<<zh[i].va<<endl;
//cout<<po<<endl;
sum+=po*2;
//flag=0;
res=zh[i].va;
po=zh[i].pos;
//cout<<"res "<<res<<endl;
//i--;
}
}
if (res>0)
{
sum+=po*2;
}
//cout<<"sum ::" <<sum<<endl;
//debug();
flag=0;
res=0;
for (int i=0;i<cnt;i++)
{
//cout<<"va : "<<fu[i].pos<<endl;
if (res+fu[i].va<=k)
{
if (!flag)
{
flag=1;
po=abs(fu[i].pos);
//cout<<"po :: "<<po<<endl;
//debug();
}
res+=fu[i].va;
//cout<<"res "<<res<<endl;
}
else
{
fu[i].va-=(k-res);
//cout<<"fu :"<<fu[i].va<<endl;
//cout<<po<<endl;
sum+=po*2;
//cout<<sum<<endl;
//flag=0;
res=fu[i].va;
po=-fu[i].pos;
}
}
//cout<<" po "<<po<<endl;
if (res >0)
{
sum+=po*2;
}
cout<<sum<<endl;
}
/*
7 10
-4 31
-3 31
-2 31
-1 31
1 21
2 21
3 21
6 10
1 8
2 7
3 5
-1 8
-2 7
-3 5
*/