JAVA hdu 4882 ZCC Loves Codefires

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4882

题解:参考题后Discuss javaherongwei 的讲解

考察序列中相邻的两题i, j(i在前)。交换它们后,解出它们之前的题目所带来的时间对答案的贡献是不变的,它们对它们后面的题目的贡献也是不变的,其他题目之间对答案的贡献自然也是不变的。唯一的变化就是,原来的EiKj一项变成了EjKi一项。那么,为了使答案变优,需要满足的条件是EjKi≤EiKj。也即Ei/Ki≥Ej/Kj。那么,最优解序列Ai一定满足,EAi/KAi是递增的。排序一遍即可。

JAVA实现的AC代码  注意使用long类型

 1 import java.io.BufferedInputStream;
 2 import java.util.*;
 3
 4 class Problem {
 5     long e, k;
 6     double x;
 7
 8     public Problem() {
 9
10     }
11 }
12
13 class MyComparator implements Comparator {
14
15     @Override
16     public final int compare(Object o1, Object o2) {
17         if (((Problem) o1).x > ((Problem) o2).x)
18             return 1;
19         else if (((Problem) o1).x == ((Problem) o2).x)
20             return 0;
21         else
22             return -1;
23     }
24
25 }
26
27 public class Main {
28
29     public static void main(String[] args) {
30
31         Scanner in = new Scanner(new BufferedInputStream(System.in));
32         while (in.hasNext()) {
33             int T = in.nextInt();
34             Problem p[] = new Problem[T];
35
36             for (int i = 0; i < T; i++) {
37                 p[i] = new Problem();
38                 p[i].e = in.nextLong();
39             }
40
41             for (int i = 0; i < T; i++) {
42                 p[i].k = in.nextLong();
43                 p[i].x = 1.0 * p[i].e / (1.0 * p[i].k);
44             }
45
46             Arrays.sort(p, new MyComparator());
47             long sum = 0;
48             long ans = 0;
49             for (int i = 0; i < T; i++) {
50                 sum += p[i].e;
51                 ans += sum * p[i].k;
52             }
53
54
55             System.out.println(ans);
56         }
57     }
58
59 }

JAVA hdu 4882 ZCC Loves Codefires,布布扣,bubuko.com

时间: 2024-12-11 17:32:59

JAVA hdu 4882 ZCC Loves Codefires的相关文章

hdu 4882 ZCC Loves Codefires(数学题+贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943

hdu 4882 ZCC Loves Codefires(贪心)

# include<stdio.h> # include <algorithm> # include <string.h> using namespace std; struct node { int v; int t; }; struct node a[100010]; bool cmp(node a,node b) { return a.v *a.t+(a.v+b.v)*b.t<b.v*b.t+(a.v+b.v)*a.t; } int main() { int

hdu 4882 ZCC Loves Codefires(贪心)

题目链接:hdu 4882 ZCC Loves Codefires 题目大意:就是CF的比赛,根据时间的推迟会相应的扣掉题目的分数,问说最少扣几分. 解题思路:相邻交换法,判断两个题目之间的比率确定前后位置. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5+5; typedef __int64 ll; struct st

HDU 4882 ZCC Loves Codefires(贪心水)

HDU 4882 ZCC Loves Codefires 题目链接 题意:给定一些任务,每个任务有e,k,e表示完成需要时间,k表示完成后消耗,为完成时间t * k,求一个顺序使得完成消耗最少 思路:贪心,知道k大的尽量早晚餐,t小的尽量早完成,所以t / k小的尽量早完成,排个序即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int

hdu 4882 ZCC Loves Codefires (贪心 推导)

题目链接 做题的时候凑的规律,其实可以 用式子推一下的. 题意:n对数,每对数有e,k, 按照题目的要求(可以看下面的Hint就明白了)求最小的值. 分析:假设现在总的是sum, 有两个e1 k1 e2 k2 则先选e1 为 (sum+e1)*k1+(sum+e1+e2)*k2 先e2: (sum+e2)*k2 + (sum+e1+e2)*k1. 比较两个式子发现不同的部分分别是 e1*k2   e2*k1; 比较大小移向 e1/k1  e2/k2, 那个小,就选那个,能达到最小. 官方题解:

HDOJ 4882 ZCC Loves Codefires

ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 198    Accepted Submission(s): 105 Problem Description Though ZCC has many Fans, ZCC himself is a crazy Fan of a coder, calle

hdoj 4882 ZCC Loves Codefires 【贪心】

题目大意:求最少被扣除的时间 策略 如题: 对于两个邻近的题目i, j,对于他们对于在他们之前解决的题目的总时间的贡献t是不影响的,对于他们之后的总时间也不影响 这就推得对每一对相邻的他们对前后都是无影响的, 如果是交换的话原来是(t+e[i])*k[i] + (t+e[i]+e[j])*k[j], 就变成了(t+e[j])*k[j] + (t+e[i]+e[j])*k[i] 改变的就是 原来的 e[i]*k[j] 变成了 e[j]*k[i] 这两个式子之间满足 e[i]*k[j] < e[j]

HDU-4882 ZCC Loves Codefires

http://acm.hdu.edu.cn/showproblem.php?pid=4882 ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 97    Accepted Submission(s): 55 Problem Description Though ZCC has many Fans,

HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)

在一个D维空间,只有整点,点的每个维度的值是0~n-1 .现每秒生成D条线段,第i条线段与第i维度的轴平行.问D条线段的相交期望. 生成线段[a1,a2]的方法(假设该线段为第i条,即与第i维度的轴平行)为,i!=j时,a1[j]=a2[j],且随机取区间[0,n-1]内的整数.然后a1[i],a2[i]在保证a1[i]<a2[i]的前提下同样随机. 由于D条线段各自跟自己维度的轴平行,我们可以转换成只求第i个维度与第j个维度的相交期望,然后乘以C(2,n)就好了 显然线段[a1,a2]和线段[