题目:

A、B、C、D四个人去吃大餐,吃饭去说好,付钱时AA制,但最后结账时,因为4个人带的钱不一样多,最后A付了112元,B付了86元,C付了10元,D没带钱,所以没有付;

但AA制需要平摊餐费,所以需要设计一种方案来解决这个问题。

现假设有n个人,m个人付款,请通过编程来解决这个问题(解决问题有多种方案,只需实现一种即可)

思路:

1、计算每个人本需要支付的钱,即平均数;

2、计算实际上每个人的盈亏,即支付金额减去平均数;

3、通过盈亏关系进行分配,即少付的将钱支付给多付的;

以题目为例,平均数为52,减去平均数后的盈亏关系为:

A:+60

B:+34

C:-42

D:-52

那么此时C、D需将钱支付给A和B,怎么支付呢?可以将问题转化为一下的矩阵形式:

  A B
C    
D    

矩阵每个格子表示:x应该支付多少给y,从上到下依次填写表格,可以得到:

  A B
C 42 0
D 18 34

代码:

#include<iostream>
#include<vector>
using namespace std; const float EPSINON=0.00001; bool isZero(float x){
return (x>=-EPSINON) && (x<=EPSINON);
} int main(){
int num_all;
int num_paid;
int num_unpaid;
float sum,avg;
int idx;
float money; cout<< "Input number of people and number of who have paid: " <<endl; while(cin >> num_all >> num_paid){
vector<float> all(num_all,0.0); sum=;
for(int i=;i<num_paid;i++){
cin>>idx>>money;
all[idx-]=money;
sum+=all[idx-];
}
cout<<endl; avg=sum/num_all; vector<int> receive;
vector<int> pay; for(int i=;i<num_all;i++){
all[i]-=avg;
if(all[i]<)
pay.push_back(i+);
if(all[i]>)
receive.push_back(i+);
} int row=pay.size();
int col=receive.size(); vector<vector<float> > table(row,vector<float>(col,0.0)); float from,to;
for(int i=;i<row;i++){
for(int j=;j<col;j++){
from=pay[i]-;
to=receive[j]-; if(isZero(all[from]))
break; if(isZero(all[to]))
continue; if(all[from]+all[to]>=){
table[i][j]=-all[from];
all[to]=all[from]+all[to];
all[from]=0.0;
}
else{
table[i][j]=all[to];
all[from]=all[from]+all[to];
all[to]=0.0;
}
}
} for(int i=;i<row;i++){
for(int j=;j<col;j++){
cout<< table[i][j]<<" ";
}
cout<<endl;
}
cout<<endl; for(int i=;i<row;i++){
for(int j=;j<col;j++){
if(!isZero(table[i][j]))
cout<<pay[i]<<" paid "<<receive[j]<<" "<<table[i][j]<<endl;
}
}
} return ;
}

(算法)AA制的更多相关文章

  1. 上海线下技术交流(AA制)

    标签: 上海线下技术交流会 作者:王清培(Plen wang) 沪江Java资深架构师 .营销云平台负责人 上海地区技术线下交流,本次聚会AA制,要的就是热爱技术,交流技术,不是凑热闹.特此留念. 活 ...

  2. <算法>进制转换超详细

    16转10 用竖式计算: 16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方 第0位: 5 * 16^0 = 5 第1位: F * 16^1 = 240 第 ...

  3. C/C++<算法>进制转换超详细

    16转10 用竖式计算: 16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方 第0位: 5 * 16^0 = 5 第1位: F * 16^1 = 240 第 ...

  4. .NET Core应用框架AA介绍(二)

    AA的开源地址 https://github.com/ChengLab/AAFrameWork AA框架是一个基础应用框架,是建立在众多大家熟知的流行工具之上并与之集成.比如:ASP.NET Core ...

  5. Blockchain technology and Application

    BTC-密码学原理 比特币本质:crypto currency[加密货币] 比特币用到的两个功能: 1.哈希 crypto graphic hash function 2.签名(非对称加密) 哈希cr ...

  6. R语言中文分词包jiebaR

    R语言中文分词包jiebaR R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据 ...

  7. Lesson 11 One good turn deserves another

    Text I was having dinner at a restaurant when Tony Steele came in. Tony worked in a layer's office y ...

  8. [No000061]"别人"凭什么要帮你?&理解中国人的人际和谐&外人、自己人与另一半

    你出身平凡家庭:你毕业于普通大学:你没有田晓霞这样的妻子或者普京这样的丈夫:在权力.金钱乃至能力积累上,你才刚刚上路.你很年轻,你渴望成功,那么,"别人"凭什么帮你? " ...

  9. C#源码500份

    C Sharp  短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform ...

随机推荐

  1. ios6sdk 和ios7sdk 分别在ios6设备和ios7设备上的效果 对比

  2. C#编程(二十)----------静态类

    如果类只包含静态的方法和属性,该类就是静态的.静态类在功能上与使用私有静态构造函数创建的类相同.不能创建静态类的实例.使用关键字static关键字,编译器可以检查用户是否不经意间给类添加了实例成员.如 ...

  3. WordPress主题开发:数据调用

    记录在开发过程中常用的 引入标签:在一个模板文件里引用另外一个文件 get_header() get_footer() get_sidebar() get_template_part() get_se ...

  4. OAuth2.0 原理流程及其单点登录和权限控制

    2018年07月26日 07:21:58 kefeng-wang 阅读数:5468更多 所属专栏: Java微服务构架   版权声明:[自由转载-非商用-非衍生-保持署名]-转载请标明作者和出处. h ...

  5. Windows:C:\Windows\System32\drivers\etc\hosts

    原文地址:http://zhumeng8337797.blog.163.com/blog/static/100768914201001983953188/. host是一个没有扩展名的系统文件,可以用 ...

  6. 如何在SpringMVC中获取request对象

    1.注解法 @Autowired private HttpServletRequest request; <listener> <listener-class> org.spr ...

  7. SVG.js 颜色渐变使用

    一.SVG.Gradient 1.线性渐变.径向渐变,设置渐变的起始点,设置径向渐变的外层半径 var draw = SVG('svg1').size(300, 300); //SVG.Gradien ...

  8. TensorFlow训练神经网络cost一直为0

    问题描述 这几天在用TensorFlow搭建一个神经网络来做一个binary classifier,搭建一个典型的神经网络的基本思路是: 定义神经网络的layers(层)以及初始化每一层的参数 然后迭 ...

  9. Just-In-Time Debugging in Visual Studio 禁止VS在服务器上调试

    To disable Just-In-Time debugging by editing the registry On the Start menu, search for and run rege ...

  10. Oracle简单的备份和恢复-导入和导出-目录

    ylbtech-Oracle:Oracle简单的备份和恢复-导入和导出-目录 Oracle安全运行离不开良好的备份和恢复机制,因为我们不是DBA.所以我们也就不过多的讲解DBA的备份和恢复.作为程序员 ...