题目链接:http://oj.woj.ac.cn:8088/problem_show.php?pid=5002
我的代码:
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的盈亏不对,其他都对,是哪出了问题?
这个题不就是算送礼结束后是赔了多少钱还是赚了多少钱?
我去试试,等我,若我没回复就是我也没整明白,题目太长了,太复杂了
我的是Java代码,可行?我会给你加注释的
@echo_lovely: 我没学Java啊
@刘浩星:
/**
* 文件名: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();//关闭
}
}
@刘浩星:
@刘浩星: 这是最简单的老实人解法,没有再简单的了,代码可能可以更精简,只是写出来让你能看思路
@echo_lovely: 不好意思,我是学C++的,Java代码我看不懂😅😅😅
@刘浩星: 那你整个变量,把各自最开始的钱保留下,然后把收入的钱保留下,送出的人数保留下,剩下的就是加减法了,我理解的是 【收入】 - 【送出】,不要算 原先送出后会余钱的问题
@刘浩星: 去看下markdown ,把你的问题代码格式化下,代码变量要有意义,全是sss的话,只有你能懂了