uva 1346 - Songs(贪心)
题目大意:John Doe 是一个著名的DJ,现在他有n首播放个曲, 每首歌曲有识别符key,歌曲长度l,以及播放频率q。想在John Doe 想将磁带上的歌曲重新排列,方便播放,播放所有歌曲有一个复杂度的计算∑(1≤i≤n)q[i] * ( ∑(1≤j≤i)l[j] ), 然后给出S,请输出重新排列后的第S首歌的识别码。
解题思路:为了使得复杂度越小,很明显的曲目长度小的要放前面,播放频率小的要放后面,所以每首歌增加一个k = l / q,即k越小的越在前。如果两个k值相同的话,前后是没有差别的。
证:l[i] = L, q[i] = Q, l[j] = K * L, q[j] = K * Q.
l[i] * q[i] + (l[i] + l[j]) * q[j] = (K * K + K + 1) Q * L = l[j] * q[j] + (l[i] + l[j]) * q[i].
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 70000; struct song { int key; int l; double q; double k; }s[N]; int n, S; void init() { memset(s, 0, sizeof(s)); for (int i = 0; i < n; i++) { scanf("%d%d%lf", &s[i].key, &s[i].l, &s[i].q); s[i].k = s[i].l / s[i].q; } scanf("%d", &S); } bool cmp(const song& a, const song& b) { return a.k - b.k < 1e-9; } int main () { while (scanf("%d", &n) == 1) { init(); sort(s, s + n, cmp); printf("%d\n", s[S - 1].key); } return 0; }
posted on 2013-12-11 13:01 love so much 阅读(205) 评论(0) 编辑 收藏 举报