工匠小K最近有n个零件需要加工。每个零件都需要ti天的时间来完成,每个零件每延迟一天加工都要缴纳一定的罚金si。延迟的天数为从今天算起到该工作开始的那天,第一个零件加工没有罚金。现在小K想知道怎样安排加工顺序可以使他要交的罚金最少,最少是多少。
这个数可能会很大,请输出这个数对m取模后的结果。
标签:描述 logs namespace lld note 开始 blog class 工作
工匠小K最近有n个零件需要加工。每个零件都需要ti天的时间来完成,每个零件每延迟一天加工都要缴纳一定的罚金si。延迟的天数为从今天算起到该工作开始的那天,第一个零件加工没有罚金。现在小K想知道怎样安排加工顺序可以使他要交的罚金最少,最少是多少。
这个数可能会很大,请输出这个数对m取模后的结果。
输入文件名为process.in。
输入第一行为一个整数n,表示需要加工的零件总数。
第二行为一个整数m,表示答案要对m取模。
第3~n+2行,每行两个整数ti和si。
输出文件名为process.out。
输出仅一行,一个整数,表示小K最少要缴纳的罚金对m取模的结果。
#include<iostream> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const ll N=500005; struct note{ ll t,s; friend bool operator < (note a,note b) { return a.s*b.t>a.t*b.s;//sort不能用>= } }poll[N]; ll Time=0,ans=0; ll n,mod; ll chen(ll a,ll b,ll pp) { ll tot=a,ans=0; while(b) { if(b&1) ans+=tot%pp; b>>=1; tot*=2; tot%=pp; ans%=pp; } return (ll) ans%pp; } int main() { scanf("%lld",&n); scanf("%lld",&mod); for(ll i=1;i<=n;i++) scanf("%lld %lld",&poll[i].t,&poll[i].s); sort(poll+1,poll+1+n); for(ll i=1;i<=n;i++) { ans+=chen(Time,poll[i].s,mod); ans%=mod; Time+=poll[i].t; } cout<<ans%mod<<endl; }
标签:描述 logs namespace lld note 开始 blog class 工作
原文地址:http://www.cnblogs.com/dancer16/p/7000932.html