zoukankan      html  css  js  c++  java
  • 天天寄快递

    思路:

      就是模拟,但有几个地方需要注意。

      1结果可能会很大,要开longlong。(这我注意到了)

      2要先把每个公司的得分加到K,(我就在 给每个数据的对应公司加分时出错了)

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<vector>
    using namespace std;
    #define N 1000009
    int n,m,s,k;
    struct node{
        int e,t;
    }q[N];
    long long mark,tot,cnt,dt;
    bool cmp( node  a,node b)
    {
        if(a.e != b.e)    return a.e<b.e;
        else    return a.t > b.t;        
    }
    bool cmpp( node  a,node b)
    {
        return a.t>b.t;        
    }
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&s,&k);
        if(s<n)
        {
            cout<<-23333333;
            return 0;
        }
        
        for(int i=1,e,t;i<=m;i++)    
        {
            scanf("%d%d",&e,&t);
            if(t>=2)
                q[++cnt].e=e,q[cnt].t=t;
        }
        sort(q+1,q+1+cnt,cmp);
        for(int i=1;i<=n;i++)
        {
            while(q[dt].e<i)
                dt++;
            dt--;    //开始没加这一步,给公司加分时,弄错了
            tot=0;
            while(tot<k&&s>=1)        
                tot+=1LL*q[++dt].t-2,s--,q[dt].t=0;
            if(tot<k)
            {
                cout<<-23333333;
                return 0;
            }
            mark+=tot;
        }
        sort(q+1,q+cnt+1,cmpp);
        for(int i=1;i<=s;i++)
        if(q[i].t>=2)
        mark+=1LL*q[i].t-2;
        cout<<mark;
        return 0;
    }

    小样例:

    输入:

      

    2 5 2 22
    1 32
    1 40
    2 25
    2 32
    2 0

    输出:

    68

  • 相关阅读:
    转载一篇 Linux 命令总结
    Linux 常用命令学习
    frp 使用
    Anaconda使用记录
    Linux 学习
    lnmp下django学习
    lnmp安装学习
    学习DHT内容
    pyqt5配置
    MyBatisPlus 常用知识点总结
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7616923.html
Copyright © 2011-2022 走看看