zoukankan      html  css  js  c++  java
  • [题解] Codeforces Round #568 (Div. 2) C题题解

    C1. Exam in BerSU (easy version)

    题目要求

    给你一个 (n)(m) ,然后接下来给出 (n) 个序列,这组序列中 (n_i) 代表第 (i) 位同志做题需要花费 (n_i) 分钟,而总时间只有 (m) 分钟。

    每位同志的做题时间都会记录总时间,而且必须前一位同志做完了题,后一位才能开始,若到他没时间了,那他就失败了。

    然而,我们的第 (i) 位老同志不想挂科,所以要你找出如果灭掉他前面的哪些同学,第 (i) 位老同志才会有时间答题而不挂科,这位老同志也怕得罪的人太多,所以尽可能得少灭掉他们

    具体思路

    题意已经蛮清楚得了,由于数据范围较小,( (1 le n le 100) ),所以直接上暴力,如下:

    1、从头开始,一次是第 (1) 位、第 (2) 位、第 (...)

    2、到了第 (i) 位后,先用 (m) 减去 (n_i) 那么得到了满足自己的答题时间后还剩下多少时间,然后分给前面的那些同学,当然是优先分给他们那些占用时间少的了。

    所以这里进行排序,只排前 (i) 个哦,不包含第 (i) 个。

    分给他们之后呢,如果不够分的话,就把剩下的那些同志挂科就可以了,
    所以总共需要干掉第 (i) 个人之前的总人数 减去 那些不需要挂科的人 即可

    总共的时间复杂度为 (O(N^3 LogN)) (10^7) 左右

    AC代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    vector<int> q;
    
    int main ( void )
    {
        int n, s;
        cin >> n >> s;
        for ( int i = 0; i < n; i++ ) { int t; cin >> t; q.push_back ( t ); };
        
        cout << 0 << ' ';
        for ( int i = 1; i < n; i++ )
        {
            int cur = s - q[i];
            sort ( q.begin(), q.begin() + i );
            bool flag = true;
            for ( int j = 0; j < i; j++ ) 
            {
                if ( ( cur -= q[j] ) < 0 ) { cout << i - j << ' '; flag = false; break; }; // WARNING
            }
            if ( flag ) cout << 0 << ' ';
        }
        
        return 0;
    }
    
    作者:Jude_Zhang
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
    支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    每次运行caffe代码之前需要考虑修改的地方
    caffe solver 配置详解
    python获取当前文件路径以及父文件路径
    Python 文件夹及文件操作
    安装NVIDIA驱动时禁用自带nouveau驱动
    博客园转载其他博客园的文章:图片和源码
    分布式开放消息系统(RocketMQ)的原理与实践
    RocketMQ基本概念及原理介绍
    rocketmq 4.3.2 解决远程不能消费问题,解决未识别到公网IP问题
    osx免驱网卡推荐
  • 原文地址:https://www.cnblogs.com/judezhang/p/14609693.html
Copyright © 2011-2022 走看看