题目:

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. SQL Server DATEDIFF() 函数(SQL计算时间差)

    select  *   from   task_list  where 1=1 and    datediff(dd,carateTime,getdate()) =0      定义和用法 DATED ...

  2. 《Go语言实战》摘录:6.1 并发 - 并行 与 并发

    6.1 并行 与 并发

  3. 自己动手实现一个MVVM库

    我们知道的,常见的数据绑定的实现方法 1.数据劫持(vue):通过Object.defineProperty() 去劫持数据每个属性对应的getter和setter2.脏值检测(angular):通过 ...

  4. lodash用法系列(1),数组集合操作

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...

  5. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  6. wp使用上下文菜单

    功能的实现需要toolkit中的MenuItem对象,具体实现方法有两种:XAML编程实现和.CS中代码实现: 1,XAML实现: 首先,在页面的xaml中加入引用: xmlns:toolkit=&q ...

  7. Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)

           自定义的Toast类 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  8. [Hook] 免root,自己进程内,startActivity hook的几种姿势

    首先关于startActivity 我们平时会经常使用到 在activity内 直接startActivity(intent) 其实这里还有一种start方式 我们可能没怎么用过 getApplica ...

  9. 修改服务的运行权限,解决SVN Post Commit问题

    先来看一下错误现象 之前在Windows Server中安装了VirtualSVN Server,然后设置了Post Commit Hooks,在提交代码到版本库之后,将代码check到本地的一个Se ...

  10. gunicorn结合django启动后台线程

    preload 为True的情况下,会将辅助线程或者进程开在master里,加重master的负担(master最好只是用来负责监听worker进程) django应用的gunicorn示例:只在主线 ...