#include <iostream>
#include <cmath>
#include <ctime>
#include <climits>
#define int long long
#define lowbit(x)((x)&-(x))
#define START (double)(1e3)
#define END (double)(1e-17)
#define DECAY 0.975
#define SHIFT_MAX 32767
using namespace std;
int n,p[100005],w[100005],l,seed,min_sum=LLONG_MAX;
inline int xorshift(){
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return(seed&0x7fff);
}
inline long long calc(int x){
long long sum=0;
for(int i=1;i<=n;i++)sum+=abs(x-p[i])*w[i];
if(sum<min_sum)min_sum=sum;
return sum;
}
inline void SA(){
int current_ans=p[n/2],current_val=calc(current_ans);
for(double t=START;t>=END;t*=DECAY){
int r=max(1.0,t/10);
int step=(xorshift()%(2*r+1))-r;
int new_x=current_ans+step;
new_x=max(0LL,min(new_x,l));
int new_val=calc(new_x),delta=new_val-current_val;
if(delta<0||(exp(-delta/t)*SHIFT_MAX>xorshift())){
current_ans=new_x;
current_val=new_val;
}
}
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>l>>n;
seed=time(0)^0xDEADBEEF;
for(int i=1;i<=n;i++)cin>>p[i]>>w[i];
for(int i=1;i<=3;i++)SA();
cout<<min_sum<<endl;
return 0;
}
我的评测记录。。。最吉利的编号(8880888),最差的退火