首页 > 试题广场 >

小红结账

[编程题]小红结账
  • 热度指数:2104 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
大家一起吃饭的时候,总是小红先付钱,然后大家再把钱转给小红。

现在小红有 n 张账单,每张账单记录了有 k 个人一起吃饭,以及吃饭的消费 c ,现在小红需要计算每个人需要转给小红多少钱。

由于大家都比较喜欢整数,所以大家每张账单会转给小红 \lceil \frac{c}{k} \rceil\lceil x \rceil 表示对 x 进行上取整。

输入描述:
第一行输入两个整数 n,m(1 \leq n,m \leq 10^5) 表示账单数和除小红外的总人数(分别用 1m 表示)。

接下来 2\times n 行,每 2 行表示一张账单。对于每张账单:

第一行输入两个整数 k (2 \leq k \leq m+1),c(1 \leq c \leq 10^9) 表示一起吃饭的人数,花费。

第二行输入 k-1 个整数,表示除小红外有哪些人一起吃饭。

数据保证, k 的总和不超过 2\times 10^5


输出描述:
输出 m 个整数,表示每个人要给小红转账的总金额。
示例1

输入

2 3
3 10
1 2
4 8
1 2 3

输出

6 6 2

说明

第一张账单:第1、2个人都会给小红转4元
第二张账单:第1、2、3个人都会给小红转2元
因此答案为4+2=6,4+2=6,2
from math import ceil


n, m = list(map(int, input().split()))
res = [0]*m
for _ in range(n):
    k, c = list(map(int, input().split()))
    a = list(map(int, input().split()))
    cur = ceil(c/k)
    for ai in a:
        res[ai-1] += cur
print(*res)
发表于 2023-08-29 22:05:58 回复(0)
#include<iostream>
#include<string>
#include<vector>
#include <math.h>

using namespace std;

#define LL long long

int main()
{
    LL n, m; cin >> n >> m;
    vector<LL> v(m + 1);
    while(n--)
    {
        LL k, c; cin >> k >> c;
        LL tmp = k - 1;
        while (tmp--)
        {
            LL num; cin >> num;
            v[num] += ceil(c * 1.0 / k);
        }
    }

    for (LL i = 1; i < v.size(); i++)
        cout << v[i] << " ";
    cout << endl;

    return 0;
}
发表于 2024-12-14 15:12:42 回复(0)
#include <bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
typedef long long ll;

int n,m,k,c,id;
long a[100005];
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>k>>c;
        for(int i=1;i<k;i++)
        {
            cin>>id;
            a[id]+=(c+k-1)/k;
        }
    }
    for(int i=1;i<=m;i++)
    {
        cout<<a[i]<<" \n"[i==m];
    }
}
int main()
{
    IO;
    solve();
    return 0;
}
发表于 2023-10-16 17:05:23 回复(0)
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        Map<Integer,Long> map=new HashMap<>();
        for(int i=1;i<=m;i++){
            map.put(i,0L);
        }
        for(int i=0;i<n;i++)
        {
            int k=sc.nextInt();
            Long c=sc.nextLong();//花费
            long spend= (long) Math.ceil(c/(k*1.0));
            for(int j=1;j<k;j++)
            {
                int member=sc.nextInt();
                Long temp=map.get(member)+spend;
                map.put(member,temp);
            }
        }
        for(int i=1;i<=m;i++)
        {
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
    }
}

发表于 2023-10-15 22:55:23 回复(0)
n, m = map(int, input().split())
res = [0] * m
for i in range(n):
    k, c = map(int, input().split())
    if c % k == 0:
        money = c // k
    else:
        money = c // k + 1
    p = list(map(int, input().split()))
    for j in p:
        res[j-1] += money
print(' '.join(list(map(str, res))))
发表于 2023-09-12 23:48:50 回复(0)
#include <stdio.h>
 
intmain() {
    longn, m,k,a;
    longc,prices[1000000];
    scanf("%ld%ld",&n,&m);
    while(scanf("%ld %ld", &k, &c) != EOF) {
        for(inti=0;i<k-1;i++){
            scanf("%ld",&a);
            if(c%k==0){
               prices[a-1]+=c/k; 
            } else{
                prices[a-1]+=c/k+1;
            }
        }
    }
    for(intj=0;j<m;j++){
        printf("%ld ",prices[j]);
    }
    return0;
发表于 2023-09-02 10:34:39 回复(0)