首页 新闻 搜索 专区 学院

请问这道C++题怎么做?

0
[待解决问题]

题目链接:http://oj.woj.ac.cn:8088/problem_show.php?pid=5002
我的代码:

include<bits/stdc++.h>//万能头文件

using namespace std;
int n,ans[15]={0};
string s[15];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>s[i];//输入人名
for(int i=1;i<=n;++i)
{
string ss;
cin>>ss;//输入送礼物的人名
for(int j=1;j<=n;++j)
if(s[j]ss)//找到送礼物的人
{
int a,b;
cin>>a>>b;
for(int k=1;k<=b;++k)
{
string sss;
cin>>sss;//输入被送礼物的人名
for(int l=1;l<=n;++l)
if(s[l]
sss)//找到被送礼物的人名
{
ans[l]+=a/b;//被送礼物的人增加钱
break;
}
}
ans[j]-=a;//送礼物的人减少钱
break;
}
}
for(int i=1;i<=n;++i)
cout<<s[i]<<" "<<ans[i]<<endl;//依次按一开始的顺序输出每个人的盈亏
return 0;
}
我这个代码除了例子上的dave的盈亏不对,其他都对,是哪出了问题?

刘浩星的主页 刘浩星 | 菜鸟二级 | 园豆:211
提问于:2022-04-20 14:15
< >
分享
所有回答(1)
0

这个题不就是算送礼结束后是赔了多少钱还是赚了多少钱?
我去试试,等我,若我没回复就是我也没整明白,题目太长了,太复杂了

echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 08:54

我的是Java代码,可行?我会给你加注释的

支持(0) 反对(0) echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 08:57

@echo_lovely: 我没学Java啊

支持(0) 反对(0) 刘浩星 | 园豆:211 (菜鸟二级) | 2022-04-21 09:02

@刘浩星:

/**
 * 文件名:GreedyGiftGivers.java
 * 文件描述:http://oj.woj.ac.cn:8088/problem_show.php?pid=5002
 * 作者:echo_lovely
 * 时间:2022年4月21日 上午8:56:45
 */
package com.xinkai.other;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * 描述:计算送礼之后,每个人比送礼前是赚了还是赔了
 */
public class GreedyGiftGivers {

	/**
	 * @param args 程序入口
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Map<String, Integer> MemberStartMoney = new HashMap<String, Integer>();// 保存最开始他们有多少钱
		Map<String, List<String>> MemberSend = new HashMap<String, List<String>>();// 保存谁给谁送
		Map<String, Integer> MemberRecvMoney = new HashMap<String, Integer>();// 保存收到的钱

//		System.out.println("请输入小组人数(2-10):");
		Scanner sc = new Scanner(System.in);// 打开输入流,从键盘获取输入
		int number = sc.nextInt();// 获取一个整数
//		System.out.println("小组人数:" + number);
		for (int i = 0; i < number; i++) {
			String name = sc.next();
			MemberStartMoney.put(name, 0);// 现在没有输入最开始他们有多少钱,置0
		}

//		System.out.println("开始送礼:");
		for (int i = 0; i < number; i++) {
			String name = sc.next();// 送礼人名称 获取一个字符串
			int money = Integer.valueOf(sc.next());// 初始的钱和送礼人数
			int sendNumber = Integer.valueOf(sc.next());// 送礼人数
			MemberStartMoney.put(name, money);// 保存初始时的钱
			List<String> receiver = new ArrayList<String>();
			for (int j = 0; j < sendNumber; j++) {
				String recvName = sc.next();// 收礼人名称
				receiver.add(recvName);
				if (MemberRecvMoney.containsKey(recvName)) {//已经收过礼了,把收钱的数值加起来
					int recvMoney = MemberRecvMoney.get(recvName) + money / sendNumber;
					MemberRecvMoney.put(recvName, recvMoney);
				} else {//还没收过钱,那就直接放进来
					MemberRecvMoney.put(recvName, money / sendNumber);
				}
			}
			MemberSend.put(name, receiver);//谁都给谁送过钱
		}

		// 合计每个人的收入和支出
		for (String key : MemberStartMoney.keySet()) {// 增强for循环,类似于foreach
			int startMoney = MemberStartMoney.get(key);// 这个人最开始的钱
			int sendPeopleCount = MemberSend.get(key).size();// 这个人的送礼人数
			int recvMoney = MemberRecvMoney.containsKey(key) ? MemberRecvMoney.get(key) : 0;

			int leastMoney = sendPeopleCount != 0 ? recvMoney - (startMoney / sendPeopleCount) * sendPeopleCount
					: recvMoney;
			System.out.println(key + " " + leastMoney);
		}
		sc.close();//关闭
	}
}
支持(0) 反对(0) echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 13:21

@刘浩星:

支持(0) 反对(0) echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 13:23

@刘浩星: 这是最简单的老实人解法,没有再简单的了,代码可能可以更精简,只是写出来让你能看思路

支持(0) 反对(0) echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 13:26

@echo_lovely: 不好意思,我是学C++的,Java代码我看不懂😅😅😅

支持(0) 反对(0) 刘浩星 | 园豆:211 (菜鸟二级) | 2022-04-21 13:30

@刘浩星: 那你整个变量,把各自最开始的钱保留下,然后把收入的钱保留下,送出的人数保留下,剩下的就是加减法了,我理解的是 【收入】 - 【送出】,不要算 原先送出后会余钱的问题

支持(0) 反对(0) echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 13:34

@刘浩星: 去看下markdown ,把你的问题代码格式化下,代码变量要有意义,全是sss的话,只有你能懂了

支持(0) 反对(0) echo_lovely | 园豆:667 (小虾三级) | 2022-04-21 13:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册