零件加工

零件加工

題目描述
工匠小K最近有n個零件需要加工。每個零件都需要ti天的時間來完成,每個零件每延遲一天加工都要繳納一定的罰金si。延遲的天數爲從今天算起到該工作開始的那天,第一個零件加工沒有罰金。現在小K想知道怎樣安排加工順序可以使他要交的罰金最少,最少是多少。

這個數可能會很大,請輸出這個數對m取模後的結果。

輸入
輸入文件名爲process.in。

輸入第一行爲一個整數n,表示需要加工的零件總數。

第二行爲一個整數m,表示答案要對m取模。

第3~n+2行,每行兩個整數ti和si。

輸出
輸出文件名爲process.out。

輸出僅一行,一個整數,表示小K最少要繳納的罰金對m取模的結果。

樣例輸入
process.in
2
100
2 33
33 2
process.out
4

process.in
4
100
3 3
6 4
2 2
8 5
process.out
81
樣例輸出
【輸入輸出樣例解釋1】

先加工第一個,需要2天時間,再加工第二個。需要繳納的罰金爲2×2=4。

【輸入輸出樣例解釋2】
如果按照1→2→3→4的順序進行加工,需要繳納的罰金爲0×3+3×4+(3+6)×2+
(3+6+2)×5=85;
最佳方案是3→1→2→4,此時需要繳納的罰金爲0×2+2×3+(2+3)×4+(2+3+6)×5=81。

提示
【數據範圍】

對於40%的數據,0< n≤10,000,0< ti,si ≤ 10,000;

對於80%的數據,0< n≤100,000,0< ti,si≤2×10^9,0< m≤10^8;

對於100%的數據,0< n≤100,000,0< ti,si≤2×10^9,0< m≤10^18。


t1s1,t2s2,tnsntxsxtysyy=x+1

sum=i=1x1t[i]


sums[x]+(sum+t[x])s[y]

sums[y]+(sum+t[y])s[x]

滿t[x]s[y]<t[y]s[x]

t[i]s[i+1]<t[i+1]s[i]t[i+1]s[i+2]<t[i+2]s[i+1]

s[i]>0,s[i+1]>0,s[i+2]>0,t[i]s[i]<t[i+1]s[i+1]<t[i+2]s[i+2]

t[1]s[1]<t[2]s[2]<<t[n]s[n]


longlong
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
struct node{
  ll t,s;
}a[100500];
ll m;
bool cmp(node x,node y){
  return x.t*y.s<y.t*x.s;
}
ll cheng(ll x,ll y){
  ll ans=0;
  ll t=y;
  while (x>0){
    if (x&1) ans=(ans+t)%m;
    t=t*2%m;
    x>>=1;
  }
  return ans;
}
int main(){
  int n;
  scanf("%d",&n);
  scanf("%lld",&m);
  for (int i=0;i<n;++i)
    scanf("%lld%lld",&a[i].t,&a[i].s);
  sort(a,a+n,cmp);
  ll ans=0;
  ll num=0;
  for (int i=0;i<n;++i){
    ans=(ans+cheng(num,a[i].s)%m)%m;
    num=(num+a[i].t)%m;
  }
  printf("%lld\n",ans);
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章