列表

详情


NC200576. Order

描述

工厂接到了n份订单,每份订单的数量为a_i件产品,工厂每天只能生产m件产品。
如果第i份订单在第d天被完成,那么我们称订单的完成天数为d_i
经理想所有订单被完成的天数的总和越小越好。请你帮他安排一下订单的完成顺序,
并计算一下这个总和。

输入描述

第一行是一个整数,表示样例的个数。

每个样例的第一行是两个整数,表示订单数与工厂每天能生成的产品数。
第二行是n个整数,表示第i份订单的数量。

输出描述

依次输出样例的结果,为一个整数。

示例1

输入:

2
3 5
3 4 5
3 4
1 1 1

输出:

6
3

说明:

第一个样例,可以直接按照原始顺序生产,3个订单分别完成于第1天,第2天,第3天,总和为6。<br/>
第二个样例,顺序没关系,第一天就能全部完成,所以总和为3。

原站题解

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

C++14(g++5.4) 解法, 执行用时: 175ms, 内存消耗: 2204K, 提交时间: 2020-02-26 20:00:54

#include<bits/stdc++.h>
using namespace std;
int a[1010];
int main()
{
	int T;
    cin>>T;
	while(T--)
	{
        int n,m;
		int ans=0,sum=0;
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		sort(a+1,a+1+n);
		for(int i=1;i<=n;i++)
		{
			sum=sum+a[i];
			ans=ans+ceil(sum*1.0/m);
		}
		cout<<ans<<endl;
	}
	return 0;
}

Python3(3.9) 解法, 执行用时: 321ms, 内存消耗: 2936K, 提交时间: 2021-02-01 16:50:53

t=int(input())
for i in range(t):
    x=0
    y=0
    n,m=map(int,input().split())
    ai=input().split()
    ai=[int(j) for j in ai]
    ai.sort()
    for j in ai:
        x+=j
        if x%m==0:
            y+=x//m
        else:
            y+=x//m+1
    print(y)

上一题