列表

详情


NC216211. 爱偷懒的小明

描述

临近期末考试的时间,就是莘莘学子开始担心自己学分的时候。 怠惰的小明这学期过得非常慵懒,为了让小明不挂科,辅导员规定小明的各个科目平时分的总和必须大于等于r。 三天打鱼两天晒网的小明的平时分不可能这么高,所以不得不补交一些作业。 小明这学期有n门课,对于第i门课,小明原有的平时分为ai,任课老师规定,小明每补交bi次作业,老师给他的第i 门课的平时分加1分。第i门课的平时分上限为ci,小明的分数达到上限后不能再继续加分。 爱偷懒的小明想问问你,最少他要补交几次作业才可以使得他的平时分总和大于等于r。

输入描述

第一行包含两个整数n, r,(1 <= n <= 100, r <= 1000)表示小明的学科数以及老师规定的平时分总和。接下来n行,每行包含3个整数 ai, bi ,ci(1 <= ai <= ci <= 1000, 1 <= bi <= 1000),分别表示小明原有的平时分,第i门课加一分所需要补交作业的次数以及第i门课的平时分上限,数据保证 ∑ci 大于 r

输出描述

最少需要补交作业的次数

示例1

输入:

2 30
10 3 40
10 2 40

输出:

20

说明:

小明补交第2门课程20次作业,课程的平时分总和变为20 + 10 = 30,达到了老师的要求 。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 114ms, 内存消耗: 25824K, 提交时间: 2021-12-09 18:27:13

n , r = map( int , input().split( ' ' ) )
s = []
for i in range( 0 , n ):
    a , b , c = map( int , input().split( ' ' ) )
    r -= a
    c -= a
    s.append( ( b , c ) )

s.sort()
res = 0

for i in range( 0 , n ):
    if r >= s[i][1]:
        r -= s[i][1]
        res += s[i][0] * s[i][1]
    else :
        res += s[i][0] * r
        break;

print( res )

C++(clang++11) 解法, 执行用时: 7ms, 内存消耗: 412K, 提交时间: 2021-01-26 19:02:34

#include<bits/stdc++.h>
using namespace std;
int n, r, f[1111], ans, a, b, c;
int main()
{
    scanf("%d%d", &n, &r);
    for(int i = 0; i < n; i++)
        scanf("%d%d%d", &a, &b, &c), f[b] += c - a, r -= a;
    for(int i = 0; i < 1001 && r > 0; i++)
        while(f[i] && r > 0)
            ans += i, f[i]--, r--;
    printf("%d", ans);
}

Python3 解法, 执行用时: 43ms, 内存消耗: 4620K, 提交时间: 2021-12-21 19:33:02

n,r=map(int,input().split())
m=[]
s=0
for i in range(n):
    a,b,c=map(int,input().split())
    m.append((a,b,c))
    s+=a
m.sort(key=lambda x:x[1])
a=0
for i in m:
    if s+i[2]-i[0]>=r:
        a+=i[1]*(r-s)
        break
    else:
        s+=i[2]-i[0]
        a+=i[1]*(i[2]-i[0])
print(a)

上一题