【推理,贪心】UVa 1319 - Maximum

看到了大神的代码。理解了好久。。。真是差距。

题意:给出m, p, a, b,然后xi满足已下两个公式, 求 xp1 + xp2 +...+ xp的最大值。

1、-1/sqrt(a) <= xi <= sqrt(a); (a>0)

2、x1+x2+...+xm = b*sqrt(a);

注意:p为偶数。

解题思路:因为p为偶数,所以sqrt(a)和-1/sqrt(a)的p次方都为正数且sqrt(a) > 1/sqrt(a).所以贪心思想时尽量先取sqrt(a);当已经取的xi的和大于b*sqrt(a)时,再取(-1/sqrt(a))抵消多出的sqrt(a)。

为了简便计算同时减少sqrt()带来的误差。可以现将2式左右同乘以sqrt(a)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int main(){
 7     int m, p, a, b;
 8     while(~scanf("%d%d%d%d", &m, &p, &a, &b)) {
 9         int l = 0, r = 0; //l, r分别代表-1/sqrt(a)与sqrt(a)的数目
10         int sum = a * b;
11         for(int i = 1; i < m; i++) { //注意最后一个数不要考虑
12             if(sum >= a) {
13                 r++;
14                 sum -= a; //xi已经取定sqrt(a)后,sum记得更新
15             }
16             else {
17                 l++;
18                 sum++;
19             }
20         }
21         double ans = l / pow(sqrt(a), p) + r * pow (sqrt(a), p);
22         ans += pow(sum/sqrt(a), p); //记得要除掉之前乘的sqrt(a);
23         printf("%d\n", (int)(ans + 0.5));
24     }
25     return 0;
26 }
时间: 2025-01-05 06:05:21

【推理,贪心】UVa 1319 - Maximum的相关文章

UVA - 108 - Maximum Sum (简单贪心)

UVA - 108 Maximum Sum Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Background A problem that is simple to solve in one dimension is often much more difficult to solve in more than one dimension.

UVA 10827 Maximum sum on a torus

算法入门经典训练指南88页练习 ::这道题只要把原矩阵扩大4倍,那么其跟最大子矩阵的题目就很类似,把二维转化成一维,求最大的序列和,不过这个序列的长度不能超过n. 长度不能超过n? 那这道题又跟hdu 3415 HDU 3415 Max Sum of Max-K-sub-sequence (单调队列) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorit

UVA1418-WonderTeam(推理+贪心)

题目链接 题意:有n支队伍比赛,每两支队伍打两场(主客场各一次),胜得3分,输不得分,平得1分.比赛结束之后会评选出一个梦之队,它满足如下条件:进球总数最多(不能并列),胜利场数最多(不能并列),丢球总数最少(不能并列).求梦之队的最低可能排名.一支得分为p的球队的排名等于等分严格大于p的球队的个数加1. 思路:其实3个限定条件只有胜利场数最多有用,因为梦之队可以在胜利场次大比分获胜,输的比赛都是1:0负于对手,其他两个就无关紧要了.要让梦之队排名尽量低,也就意味着让其得分尽量低.那么我们假设梦

UVa 108 - Maximum Sum(最大连续子序列)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=44  Maximum Sum  Background A problem that is simple to solve in one dimension is often much more difficult to solve in more th

贪心 UVA 11729 Commando War

题目传送门 1 /* 2 贪心:按照执行时间长的优先来排序 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <iostream> 7 #include <cstring> 8 #include <string> 9 #include <cmath> 10 using namespace std; 11 12 const int MAXN = 1e3 + 10; 13

UVA 10827 Maximum sum on a torus 最大矩阵和

题目链接:UVA - 10827 题意描述:给出一个n*n矩阵,把第一行和最后一行粘一起,把第一列和最后一列粘一起,形成一个环面,求出这个环面中最大的矩阵和. 算法分析:首先复制n*n这个矩阵,形成由4个这样小矩阵组成的大矩阵,然后在这个大矩阵里找出最大矩阵和,一看貌似和poj1050这道题有些相似,但是这道题数据大一些,O(150^4)应该会超时吧.我们可以这样想,先枚举这个最大和矩阵的左上角在大矩阵中的位置,然后枚举最大和矩阵的行数和列数,在枚举过程中处理最大和,然后更新答案即可. 1 #i

UVa 11059 Maximum Product

题意:给出n个数组成的序列,求乘积最大的连续子序列 看的紫书,因为n最大为18,每个数最大为10,所以10^18用long long 能够存下, 直接枚举起点和终点找最大值就可以了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include&l

UVA 108 Maximum Sum

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=44 Dynamic Programming. 对所有可能存在的长方形计算sum,利用已知的小的sub-rectangle计算包含有这些相减或相加得到的new rectangle.代码如下: 1 #include <iostream> 2 #

UVA 11059 Maximum Product(枚举start+end)

题目大意: 就是说给你n个数字,然后求出连续序列的最大和.如果ans为负数就输出0,要么就输出这个ans. 解题思路: 其实我们只需要枚举起点和终点,然后考虑所有的情况就可以了,有点类似于求解最大连续和的问题. 唯一的不同就是每次都要初始化t = 1, t*=a[j].注意long long.因为最多有18个数字,且每个数字的 最大值为10,那么他们的乘积是不会超过10^18的. 代码: # include<cstdio> # include<iostream> # include