PTA——L2-009 抢红包(结构体排序)

本文介绍了解决L2-009抢红包问题的C++代码,包括理解题意、使用结构体存储个人信息、计算红包影响后的金额,并按照特定规则进行排序输出每个人的最终收入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、题目

L2-009 抢红包

二、题解

1.基本思路:

  • 主要时要理解题意,每个人发完红包,自己的金额就要减去红包的总金额数
  • 最后在按照题意排个序即可

2.代码:

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
const int N = 1e4+10, INF = 0x3f3f3f3f;
struct node{
	int id,num,p; //编号,抢到的红包个数,金额(分) 
	double w; //元
	bool operator < (const node &A){ //重载<运算符 
		if(w==A.w&&num!=A.num) return num>A.num; //红包的个数递减输出
		else if(w==A.w&&num==A.num) return id<A.id; //按个人编号递增输出
		return w>A.w; //收入金额递减顺序
	} 
}arr[N]; 

void solve() {
	int n; cin>>n;
	for(int i=1;i<=n;i++){
		int k,sum=0; //发的红包个数k,总金额sum分 
		cin>>k;
		set<int> s; //每人最多只能抢1次
		for(int j=1;j<=k;j++){
			int a,b; cin>>a>>b;
			if(s.count(a)) continue;
			s.insert(a); //编号a已抢过 
			sum+=b; //记录总金额 
			arr[a].num++; arr[a].p+=b;
		}
		arr[i].p-=sum; arr[i].id=i; //记录i的信息 
	} 
	for(int i=1;i<=n;i++) arr[i].w=arr[i].p*1.0/100; //分转变为元 
	sort(arr+1,arr+n+1);
	for(int i=1;i<=n;i++)
	  printf("%d %.2f\n",arr[i].id,arr[i].w);
}

signed main() {
//	IOS;
	int T=1;  
//	cin>>T;
	while(T--) {
		solve();
	}
	return 0;    
}
/*
10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10

1 11.63
2 3.63
8 3.63
3 2.11
7 1.69
6 -1.67
9 -2.18
10 -3.26
5 -3.26
4 -12.32
*/

### 关于 PTA 平台上的抢红包功能测试点 在软件测试领域,针对特定的功能模块(如抢红包),通常需要从多个维度进行全面覆盖。以下是基于已有引用内容以及常见测试实践所总结的第一个测试点。 #### 功能性测试 第一个测试点应关注 **抢红包的核心逻辑验证**,即确保红包金额分配正确无误。具体而言,需确认以下条件是否满足: - 输入总金额 `M` 和参与人数 `N` 后,系统能够按照预设规则将金额合理拆分并发放给每位参与者[^1]。 - 验证最终所有用户获得的金额之和等于初始设定值 `M`,且单个用户的金额范围符合预期设置 (例如最小单位为 0.01 元)[^2]。 ```python def distribute_red_packet(total_amount, num_people): import random amounts = [] remaining = total_amount * 100 # Convert to cents for precision for i in range(num_people - 1): max_possible = min(int(remaining / (num_people - i)), int((total_amount * 100) / 2)) amount = random.randint(1, max_possible) amounts.append(amount / 100) remaining -= amount amounts.append(remaining / 100) return amounts ``` 此代码片段展示了如何随机分配红包金额的一种实现方式,并通过循环逐步减少剩余可分配总额来保证最后一位领取者也能拿到合理的数值[^3]。 --- #### §相关问题§ 1. 如何设计边界情况下的抢红包测试用例? 2. 抢红包场景中的并发处理机制应该如何测试? 3. 是否有必要对抢红包过程加入时间延迟模拟真实网络状况?如果需要,则怎样构建此类环境? 4. 用户界面(UI)方面有哪些需要注意的地方,在执行自动化脚本时能否有效捕获这些细节? 5. 性能指标上定义什么样的标准才算合格,比如响应时间和吞吐量的具体阈值是多少?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值