贪心-零件加工

Posted dancer16

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心-零件加工相关的知识,希望对你有一定的参考价值。

 

题目描述

工匠小K最近有n个零件需要加工。每个零件都需要ti天的时间来完成,每个零件每延迟一天加工都要缴纳一定的罚金si。延迟的天数为从今天算起到该工作开始的那天,第一个零件加工没有罚金。现在小K想知道怎样安排加工顺序可以使他要交的罚金最少,最少是多少。

这个数可能会很大,请输出这个数对m取模后的结果。

 

输入

输入文件名为process.in

输入第一行为一个整数n,表示需要加工的零件总数。

第二行为一个整数m,表示答案要对m取模。

第3~n+2行,每行两个整数tisi

 

输出

输出文件名为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
 
这道题第一眼就不会做,于是状压(n<=10)目测爆0
其实这题很水
在模拟第二个样例的时候就能发现先取2,2和先取 3,3 是一样的
我们假设前几个物品花费时间T,
有两个物品时间和罚金分别为t1,t2;s1,s2;
这两个物品的选取顺序和前后面的选取都没有关系
 
先取第一个为T*s1+(T+t1)*s2=T(s1+s2)+t1*s2
第二个T*s2+(T+t2)*s1=T(s1+s2)+t2*s1
 
只要判断t1*s2和t2*s1的大小即可
#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;
} 

 

以上是关于贪心-零件加工的主要内容,如果未能解决你的问题,请参考以下文章

Java- 多机调度(贪心算法)

零件加工方案

CNC零件加工如何保证质量?

机械生产制造企绝大部分零件需要考几级加工的方法来获得

怎样备份FANUC 0i零件加工程序、PMC程序、PMC 参数,CNC参数、螺距补偿、宏变量数据需要备份,对于数控机

机加尺寸精度等级有多少级?车床加工能达到啥精度等级?怎样确定一个零件的加工工时?