#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