怎样去思考问题 解决问题 zkc学长的福利

题目描述
又是一年ACM集训的时刻,zkc学长邀请n位同学来玩一个有奖游戏。首先,他让每个同学在左、右手上面分别写下一个整数,zkc学长自己也在左、右手上各写一个整数。然后,让这n位同学排成一排,zkc学长站在队伍的最前面。排好队后,所有的同学都会获得zkc学长分发的若干肉松饼,每位同学获得的肉松饼数分别是:排在该同学前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。


zkc学长不希望某一个同学获得特别多的福利,所以他想请你帮他重新安排一下队伍的顺序,使得获得福利最多的同学,所获福利尽可能的少。注意,zkc学长的位置始终在队伍的最前面。


【数据范围】 对于100%的数据,有1 ≤ n ≤1,0000 < a、b < 10000

输入
第一行一个n表示n个同学

第二行两个数字代表zkc学长左手和右手的数字

接下来的n行分别代表第n个同学左手和右手的数字

输出
一个数字代表获得福利最多同学所获得福利

样例输入
3
1 1
2 3
7 4
4 6

样例输出
2
提示

按1、2、3号同学这样排列队伍,获得福利最多的同学所获得肉松饼数为2; 

按1、3、2这样排列队伍,获得福利最多的同学所获得肉松饼数为2;

按2、1、3这样排列队伍,获得福利最多的同学所获得肉松饼数为2;

按2、3、1这样排列队伍,获得福利最多的同学所获得肉松饼数为9;

按3、1、2这样排列队伍,获得福利最多的同学所获得肉松饼数为2;

按3、2、1这样排列队伍,获得福利最多的同学所获得肉松饼数为9。

因此,福利最多的同学最少获得2个肉松饼,答案输出2。

最重要的话就是   排在前面同学 左手上数字的成绩除以这个同学的右手数字 就是这个同学应有的饼干数 .

 

 

现在 如果A在B的前面  那么A 所获得的饼的数量  t/r.a   B得到的饼的数量就是  t*la/rb  

现在 如果B在A的前面  那么B 所获得的饼的数量  t/r.b   A得到的饼的数量就是  t*lb/ra

假设 A必须在B的前面  那么 一定可以推导出来一个包含 四个变量的  表达式  用于排序

现在关键的就是  为什么 A必须排在B的前面   最外层的原因就是 为了得到 饼干数量最多的人  得到的饼干尽量的少    

所以该问题可以简化为    前面的所有同学的左手只是一只A手   那只A手上面的数字是B前面所有同学的左手乘积   于是 现在就简化为了两个人的问题.     同样的一个人  是  排在前面的到 饼的数量多还是 排在后面得到的饼的数量多呢 . 很明显是排在  后面的 多 所以  为什么  A排在 B的前面 因为        t*la/rb<t*lb/ra   (这样  最大的数量就尽量的小了   )   

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 struct S
 5 {
 6     int r,l;
 7 };
 8 bool cmp(S a,S b)
 9 {
10     return a.l*a.r<b.l*b.r;
11 }
12 int main()
13 {
14     S a[1010];
15     int i,j,m,n,t;
16     double maxn;
17     while(scanf("%d",&n)!=EOF)
18     {
19         maxn=1;
20         for(i=0;i<=n;i++)
21         {
22             scanf("%d%d",&a[i].l,&a[i].r);
23         }
24         sort(a+1,a+n+1,cmp);
25         for(i=0;i<n;i++)
26         {
27             maxn*=a[i].l;
28         }
29         j=a[n].r;
30         maxn=maxn/j;
31         j=maxn;
32         if(j>maxn)
33             maxn=j-1;
34         else
35             maxn=j;
36         printf("%.0lf\n",maxn);
37     }
38     return 0;
39 }

 好像数据变大了,我的方法过不掉了,   请等一下我修正后的代码。

posted @ 2016-02-06 13:47  X-POWER  阅读(630)  评论(2编辑  收藏  举报