UVa 1346 - Songs

来源:互联网 发布:windows系统事件日志 编辑:程序博客网 时间:2024/05/17 03:14

题意

有N个唱片,每个唱片有ID,长度和频率

sum = f[i] * (len[i] + len[i + 1]..... + len[n]),求sum最小的时候第k个唱片的id。

思路

可以用相邻交换法证明当f1 / l1 > f2 / l2时,sum1 > sum2。

所以排个序就行。

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <functional>
  4. #include <stack>
  5. #include <set>
  6. #include <iostream>
  7. #include <string>
  8. #include <vector>
  9. #include <queue>
  10. #include <cstring>
  11. #include <string>
  12. #include <sstream>
  13. #include <map>
  14. #include <cmath>
  15. #define LL long long
  16. #define lowbit(x) ((x) & (-x))
  17. #define MP(a, b) make_pair(a, b)
  18. #define MS(arr, num) memset(arr, num, sizeof(arr))
  19. #define PB push_back
  20. #define ROP freopen("input.txt", "r", stdin);
  21. const double PI = acos(-1.0);
  22. const int INF = 0x3f3f3f3f;
  23. using namespace std;
  24. const int MAXN = (1 << 16) + 5;
  25. struct POINT
  26. {
  27. int id, len;
  28. double fre;
  29. bool operator < (const POINT &a) const
  30. {
  31. return len * a.fre < a.len * fre;
  32. }
  33. }pit[MAXN];
  34. int main()
  35. {
  36. //ROP;
  37. int n, i, j;
  38. while (~scanf("%d", &n))
  39. {
  40. for (i = 0; i < n; i++) scanf("%d%d%lf", &pit[i].id, &pit[i].len, &pit[i].fre);
  41. sort(pit, pit + n);
  42. int a;
  43. scanf("%d", &a);
  44. nth_element(pit, pit + a - 1, pit + n);
  45. printf("%d\n", pit[a - 1].id);
  46. }
  47. return 0;
  48. }
0 0