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 <cstdio>
#include <algorithm>
using namespace std;

struct song {
	int key;
	double K;
	bool operator < (const song &T) const {
		return K < T.K;
	}
} s[70000];

int main() {
	int n;
	while (scanf("%d", &n) != EOF) {
		for (int i = 0; i < n; i++) {
			int l;
			double f;
			scanf("%d%d%lf", &s[i].key, &l, &f);
			s[i].K = l / f;
		}

		sort(s, s + n);
		int S;
		scanf("%d", &S);
		printf("%d\n", s[S-1].key);
	}
	return 0;
}


你可能感兴趣的:(uva 1346 - Songs(贪心))