题目链接:http://codeforces.com/problemset/problem/93/B

B. End of Exams
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Students love to celebrate their holidays. Especially if the holiday is the day of the end of exams!

Despite the fact that Igor K., unlike his groupmates, failed to pass a programming test, he decided to invite them to go to a cafe so that each of them could drink a bottle of... fresh cow milk. Having entered the cafe, the m friends found n different kinds of milk on the menu, that's why they ordered n bottles — one bottle of each kind. We know that the volume of milk in each bottle equals w.

When the bottles were brought in, they decided to pour all the milk evenly among the m cups, so that each got a cup. As a punishment for not passing the test Igor was appointed the person to pour the milk. He protested that he was afraid to mix something up and suggested to distribute the drink so that the milk from each bottle was in no more than two different cups. His friends agreed but they suddenly faced the following problem — and what is actually the way to do it?

Help them and write the program that will help to distribute the milk among the cups and drink it as quickly as possible!

Note that due to Igor K.'s perfectly accurate eye and unswerving hands, he can pour any fractional amount of milk from any bottle to any cup.

Input

The only input data file contains three integers n, w and m (1 ≤ n ≤ 50, 100 ≤ w ≤ 1000, 2 ≤ m ≤ 50), where n stands for the number of ordered bottles, w stands for the volume of each of them and m stands for the number of friends in the company.

Output

Print on the first line "YES" if it is possible to pour the milk so that the milk from each bottle was in no more than two different cups. If there's no solution, print "NO".

If there is a solution, then print m more lines, where the i-th of them describes the content of the i-th student's cup. The line should consist of one or more pairs that would look like "b v". Each such pair means that v (v > 0) units of milk were poured into the i-th cup from bottle b (1 ≤ b ≤ n). All numbers b on each line should be different.

If there are several variants to solve the problem, print any of them. Print the real numbers with no less than 6 digits after the decimal point.

Examples
Input

Copy
2 500 3
Output

Copy
YES
1 333.333333
2 333.333333
2 166.666667 1 166.666667
Input

Copy
4 100 5
Output

Copy
YES
3 20.000000 4 60.000000
1 80.000000
4 40.000000 2 40.000000
3 80.000000
2 60.000000 1 20.000000
Input

Copy
4 100 7
Output

Copy
NO
Input

Copy
5 500 2
Output

Copy
YES
4 250.000000 5 500.000000 2 500.000000
3 500.000000 1 500.000000 4 250.000000 题目大意:输入n,w,m 分别代表n杯不同的饮料,每杯饮料有w体积,要平均分为m杯
思路:这题A出来感觉非常不简单,一天就做了这一道题。。。 其实这题要懂的就是如何贪心,然后如何存数据答案,还有一个很重要的就是double的精度问题,控制不好就别想过了
贪心思想是: 每次都使得当前用的饮料尽可能的多,如果用了两次都没有用完的话,那就显然是“NO”了,贪心思想很简单。
然后关于存储数据的:因为我们并不知道装满一杯要多少种饮料,所以这个就必须要用动态存储了,这就需要用到vector,我们要存储的有第几杯,用了哪种饮料,用了多少,所以要三个
变量来存储。 学了一下如果用vector来存储三个变量,就是再用一个pair,具体怎么用在代码中可以看到
double精度的控制:这题本来自己感觉是没有问题的,然后提交,wa在第十个吧,忘记了,然后试了数据,发现结果跟自己想的不一样,后来改代码,把过程中的结果输出来,发现
在运行过程中double 保留的是三位小数,但是相减却又保留的是六位小数,比如一个是333.333,1000和它相减则会得到666.666667,,但是下一次和666.667比较,如果我们简单
的比较二者是否相等的话,显然是不相等的,但是二者实际上是相等的,所以要二者相减判断差值是否在误差之外就行了。
看代码
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
typedef pair<int,double> p;
int main()
{ //vector<pair<int,double> > ans[100];
vector<p>ans[];
p fun;
int n,w,m;
cin>>n>>w>>m;
if(m>n*) cout<<"NO"<<endl;//n瓶饮料最多能分出2*n杯饮料,所以大于它直接NO
else
{
int cnt=,sum1=,sum3=;//cnt代表第几瓶,sum1代表第几个人,sum3判断是否用了两次以上
double ave=1.0*n*w/m;
double sum=ave,sum2=w;//补满一瓶还需的容量,一瓶还剩多少
while(cnt<=n&&sum1<=m)//
{
if(fabs(sum-sum2)<1e-)//精度判断,一定要放在最前面,不然会判断别的,也就wa了
{
//cout<<"2"<<endl;
fun.first=cnt;
fun.second=sum2;
ans[sum1].push_back(fun);
//ans[sum1].push_back({cnt,sum2});
sum3++;
if(sum3>)
{
cout<<"NO"<<endl;
return ;
}
//ans[cnt].insert(n);
//ans.insert(cnt,n);
sum3=;
sum2=w;
sum=ave;
cnt++;
sum1++;
//cout<<cnt<<" "<<sum<<" "<<sum2<<endl;
}
else if(sum>sum2)
{
// cout<<"1"<<endl;
fun.first=cnt;
fun.second=sum2;
ans[sum1].push_back(fun);
//ans[sum1].push_back({cnt,sum2}); sum3++;
if(sum3>)
{
cout<<"NO"<<endl;
return ;
}
sum3=;
sum-=sum2;
sum2=w;
cnt++;
}
//else if(sum==sum2)
else
{
//cout<<"3"<<endl;
//printf("%.3lf %.6lf\n",sum,sum2);
fun.first=cnt;
fun.second=sum;
ans[sum1].push_back(fun);
//ans[sum1].push_back({cnt,sum});
sum2=sum2-sum;
if(sum2==0.000000) cout<<"sss"<<endl;
sum=ave;
sum3++;
sum1++;
}
if(sum3>)
{
cout<<"NO"<<endl;
return ;
}
}
cout<<"YES"<<endl;
for(int i=;i<=m;i++)
{
for(int j=;j<ans[i].size();j++)
{
printf("%d %.6lf ",ans[i][j].first,ans[i][j].second);
//cout<<ans[i][j].first<<" "<<ans[i][j].second;
}
cout<<endl;
}
}
return ;
}

CodeForces - 93B(贪心+vector<pair<int,double> >+double 的精度操作的更多相关文章

  1. 2018宁夏邀请赛G(DFS,动态规划【VECTOR<PAIR>】)

    //代码跑的很慢四秒会超时,结尾附两秒代码(标程) #include<bits/stdc++.h>using namespace std;typedef long long ll;cons ...

  2. 【vector+pair】洛谷 P4715 【深基16.例1】淘汰赛

    题目:P4715 [深基16.例1]淘汰赛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题因为数据范围不大,所以做法可以非常简单,使用一个vector加上pair就可以了: ...

  3. 关于c中 int, float, double转换中存在的精度损失问题

    先看一段代码实验: #include<limits> #include<iostream> using namespace std; int main() { unsigned ...

  4. C++中将string类型转换为int, float, double类型 主要通过以下几种方式:

      C++中将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为 ...

  5. QT中QString 与 int float double 等类型的相互转换

    Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...

  6. [C++] string与int, float, double相互转换

    参考:http://blog.csdn.net/candadition/article/details/7342380 将string类型转换为int, float, double类型 主要通过以下几 ...

  7. Converter -> public static int ToInt32(double value) 你用对了么?

    Convert.ToInt32()  是我们经常使用的方法,但如果我们写如下的代码,能确定它的输出值么? var x = 7.5; Console.WriteLine(7.5 + ": &q ...

  8. C 语言实例 - 计算 int, float, double 和 char 字节大小

    C 语言实例 - 计算 int, float, double 和 char 字节大小 C 语言实例 C 语言实例 使用 sizeof 操作符计算int, float, double 和 char四种变 ...

  9. Qt中 QString 和int,double等的转换

    Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...

随机推荐

  1. BZOJ4695:最假女选手

    浅谈区间最值操作和历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...

  2. docker-建立私有registry

    我们知道可以使用hub.docker.com作为我们公共或者私有的registry.但由于服务器在国外的原因,网速会非常的慢.所以我们在利用docker开发构建容器服务时,我们希望能够建立自己的私有r ...

  3. mount error(12): Cannot allocate memory解决办法

    http://hi.baidu.com/zhangbin101004/item/e459f4d1f818dfbd33db903b 今天囧了啊,在ubuntu挂载的文件夹里面解压数据库,结果linux嫌 ...

  4. web攻击之六:DNS攻击原理与防范

    随着网络的逐步普及,网络安全已成为INTERNET路上事实上的焦点,它关系着INTERNET的进一步发展和普及,甚至关系着INTERNET的生存.可喜的是我们那些互联网专家们并没有令广大INTERNE ...

  5. 【转】Ruby on Rails中select使用方法

    在Ruby on Rails中真的有一堆Select helper可以用,我们经常容易混淆.常见的有三个..select, select_tag, collection_select(其余的什么sel ...

  6. HBase 二级索引与Coprocessor协处理器

    Coprocessor简介 (1)实现目的 HBase无法轻易建立“二级索引”: 执行求和.计数.排序等操作比较困难,必须通过MapReduce/Spark实现,对于简单的统计或聚合计算时,可能会因为 ...

  7. Could not get lock /var/lib/dpkg/lock - open 解决方法

    无法获得锁 /var/lib/dpkg/lock E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily un ...

  8. 7、linux常见系统环境变量

    使用env命令显示所有环境变量 env  (常见的有HOSTNAME,SHELL,HISTSIZE,PERL5LIB,USER,PATH,PWD,LANG,HOME, LD_LIBRARY_PATH ...

  9. 解决因为终端打印造成的java程序假死

    问题状态: java 程序 日志采用 log4j 运行时由另一个管理进程拉起,程序在后台运行. 现象: 程序后台运行时,运行一段时间后假死 分析原因: 尝试打印输出,定位假死的具体位置,发现出现假死的 ...

  10. 阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第2课-基于Epoll的采集端程序框架设计

    回顾之前的整个程序架构 把epoll机制应用到这个架构上去 下面主要去分析我们的系统中有没有需要等待的事件,先看看采集子系统 在采集子系统当中,摄像头有数据,摄像头采集到图像数据可以作为一个等待事件. ...