#P1494. 第2题-小美结账
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 256
            Accepted: 81
            Difficulty: 2
            
          
          
          
                       所属公司 : 
                              美团
                                
            
                        
              时间 :2023年8月26日
                              
                      
          
 
- 
                        算法标签>模拟          
 
第2题-小美结账
思路:模拟
有n栋房子,第i房子里有k个租户,并且该房子租金为c,那么每个人就要付给房东⌈c/k⌉的钱,现在给定每个房间租户的信息,求每个租户需要付房东多少钱?
由于每个房间的计价方式是独立的,除了同一个租户租了不同房子需要累加外,并没有其他的联系,所以本题直接按照题目计算方式模拟即可。
代码
C++
AC
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    vector<long long> ans(m, 0);
    for (int i = 0; i < n; ++i) {
        int k, c;
        cin >> k >> c;
        long long cost = (c - 1) / static_cast<long long>(k) + 1;  // 向上取整
        
        string arrInput;
        getline(cin >> ws, arrInput);
        istringstream iss(arrInput);
        
        int x;
        while (iss >> x) {
            ans[x - 1] += cost;  // 每名租客累计答案
        }
    }
    for (int i = 0; i < m; ++i) {
        if (i > 0) {
            cout << " ";
        }
        cout << ans[i];
    }
    cout << endl;
    return 0;
}
python
def main():
    n, m = map(int, input().split())  # 输入 n 和 m
    ans = [0] * m  # 创建一个长度为 m 的零列表用于存储答案
    for _ in range(n):
        k, c = map(int, input().split())  # 输入 k 和 c
        cost = (c - 1) // k + 1  # 计算成本,使用整数除法进行向上取整
        arr_input = input().strip().split()  # 输入租客编号列表
        for x in arr_input:
            ans[int(x) - 1] += cost  # 每名租客累计答案
    print(" ".join(map(str, ans)))  # 打印答案,用空格连接
if __name__ == "__main__":
    main()
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] nm = br.readLine().split(" ");
        int n = Integer.parseInt(nm[0]);
        int m = Integer.parseInt(nm[1]);
        long[] ans = new long[m];  // 创建一个长度为 m 的零数组用于存储答案
        for (int i = 0; i < n; ++i) {
            String[] kc = br.readLine().split(" ");
            int k = Integer.parseInt(kc[0]);
            int c = Integer.parseInt(kc[1]);
            long cost = (c - 1) / (long) k + 1;  // 向上取整
            StringTokenizer tokenizer = new StringTokenizer(br.readLine());
            for (int j = 0; j < k - 1; ++j) {
                int x = Integer.parseInt(tokenizer.nextToken());
                ans[x - 1] += cost;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < m; ++i) {
            if (i > 0) {
                sb.append(" ");
            }
            sb.append(ans[i]);
        }
        System.out.println(sb.toString());
    }
}
        题目内容
小美有n栋房子需要收租。
对于第i栋房子,有k个租户(小美在每栋房子里都有一个自己的住处,所以实际只有k-1个人需要给小美转账),总租金为c.那么就意味着每个人需要给小美转⌈kc⌉ 这么多钱,⌈x⌉ 代表对实数x进行向上取整。
输入描述
第一行输入两个整数 n,m(1<n,m<=1e5)表示房子数和总租户数。
接下来 2×n 行,每2行表示一栋房子。对于每栋房子:
第一行输入两个整数k(2≤k≤m+1),c(1≤c≤1e9)表示租户人数以及本栋房子的总金额。
第二行输入 k−1 个整数,表示本栋房子租户的编号。租户用编号1到m 来表示
输出描述
输出m个整数 表示每个租户需要转给小美多少钱
样例
输入
2 3
3 10
1 2
4 10
1 2 3
输出
7 7 3