codeforces 557B. Pasha and Tea 解题报告

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

题目意思:有 2n 个茶杯,规定第 i 个茶杯最多只能装 ai 毫升的水。现在给出 w 毫升的水,需要把这w毫升(可以不用光)的水倒入到这 2n 个茶杯中,使得分给n个男的每个水杯的水恰好是n个女的2倍(注意,n个男的水杯装的水是一样的,n 个女也是)。现在问的是,怎样使得2n个杯装的水最多,求出这个值。

*********************************************( 又开始误导他人成分,忽略之)

  假设倒入女孩的水杯的水为 x 毫升,我做的时候直接列出两个不等式,然后取较小值 * 3n(nx 是所有女的水杯的水,2nx就是所有男的),于是就一直过不了pretest 8了。

   (1)2*x  ≤ 水杯最大容量(ai 最大值)

   (2)nx+ 2nx ≤ w (总不能超过w毫升的水吧)

  这样是错的啦。。。。首先(1)式就列得不对!试想,假设水杯编号为1~2n,由于前 n 小的水杯是分给女生的,这表明后 n 大的水杯是分给男生。但是男生最大只能取的水为 n+1 的容量,因为每只水杯的容量有限制嘛~~~~所以我们需要排序,找到第 n+1 位置大的水杯。我一开始还以为要用到二分做啦。。。。= =

*********************************************

  正确思路是需要分情况讨论的!

  将ai 排完序之后我们需要取出a[1]和a[n+1] 来讨论。也就是最小水杯容量(x)和第 n+1 大水杯容量y。因为最优解就是将 x 分配给每个女生,y 分配给每个男生。

  注意,它们有可能构成 2 倍的关系,也可能不。所以很自然就要讨论啦。。。。2x 和 y 的大小关系!

  (1) 2x ≤ y    表示可以将 x 毫升的水分给女生,2x 分给男生,反正2x肯定不大于y

    总分配水量为:xn + 2xn = 3xn

  (2) 2x > y    此时我们只能把 y/2 毫升的水分给女生(没说一定要分足x毫升的水给女生嘛, y/2 肯定比x 小,不等式自己移位看呗)

    总分配水量为: y/2 * n + y * n = 1.5 yn

  当然,我们怎么分,总不能超过给出的 w 毫升啦,所以最后要取较小值作为答案

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = 2e5 + 5;
 9 int a[maxn];
10
11 int main()
12 {
13     #ifndef ONLINE_JUDGE
14         freopen("in.txt", "r", stdin);
15     #endif // ONLINE_JUDGE
16
17     int n, w;
18     while (scanf("%d%d", &n, &w) != EOF) {
19
20         for (int i = 0; i < 2*n; i++) {
21             scanf("%d", &a[i]);
22         }
23         sort(a, a+n+n);
24         int maxv = a[n];
25         int minv = a[0];
26
27         double ans = 0.0;
28         if (minv*2 > maxv) {
29             ans =  (double)maxv * n * 1.5;  // maxv/2 * n + maxv * n;
30         }
31
32         else {
33             ans = (double)minv * n * 3.0;
34         }
35         printf("%.9lf\n", min((w*1.0), ans));
36     }
37     return 0;
38 }

时间: 2024-10-11 15:04:45

codeforces 557B. Pasha and Tea 解题报告的相关文章

Codeforces 557B Pasha and Tea 倒茶

题意:Pasha有2n个茶杯,每个茶杯的容积不同.Pasha有2n个朋友,男女各n个.现在Pasha要将总容积为w的茶倒在2n个茶杯里,分给这2n个朋友,并规定同性别的朋友茶杯中的茶容积相同,且每个男性朋友茶杯中茶的容积是每个女性朋友茶杯中茶的容积的两倍.求所有朋友茶杯中的茶容积之和的最大值. 水题.首先按照茶杯的容积排序,较小的n个茶杯肯定是分给了女生,较大的n个茶杯分给男生.若不然,如果某个男性朋友茶杯容积比某个女性朋友茶杯容积小的话,由于男性朋友茶杯中茶的容积较大,那么互换他们的茶杯,仍然

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces 459(#261 (Div. 2) ) 解题报告

A:给你一个正方形的两点,让你求其余亮点 解法:乱搞 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月15日 星期五 23时24分04秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<

Codeforces 450(#257 (Div. 2) ) 解题报告

A: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月19日 星期六 21时01分28秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bits

Codeforces Round #262 (Div. 2)解题报告

详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2 1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A 有n双袜子,每天穿一双然后扔掉,每隔m天买一双新袜子,问最多少天后没有袜子穿.. 简单思维题:以前不注重这方面的训练,结果做了比较久,这种题自己边模拟边想.不过要多考虑trick ```c++ int main(){ i

Codeforces 448(#256 (Div. 2) ) 解题报告

A: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月17日 星期四 21时44分03秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bits

Codeforces Round #616 (Div. 2)解题报告

Codeforces Round #616 (Div. 2)解题报告 A. Even But Not Even 找两个奇数就行了. #include<bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; string ans = ""; for(int i = 0; i < n; i++) { if(int(s[i] - '0')%2

codeforces 507B. Amr and Pins 解题报告

题目链接:http://codeforces.com/problemset/problem/507/B 题目意思:给出圆的半径,以及圆心坐标和最终圆心要到达的坐标位置.问最少步数是多少.移动见下图.(通过圆上的边固定转动点,然后转动任意位置,圆心就会移动了,这个还是直接看图吧) 解题的思路就是,两点之间,距离最短啦----要想得到最少步数,我们需要保证圆心在这条连线上移动,每次转动的角度是180度,而每步移动的距离是2r,直到两个圆交叉,要注意最后一步转动的角度可能会小于180度.最后就是注意精

codeforces 500B.New Year Permutation 解题报告

题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 n * n 的矩阵A,当且仅当 Aij = 1 时,pi 与 pj 可以交换数值.现在问如何交换数值,使得最后得到的排列字典序最小. 比赛的时候不会做,看了Tutorial 1 的解法,觉得别人做得太巧妙了,出题者也出得很好 ^_^ 可以看这个:http://codeforces.com/blog