uva 1346 Songs(贪心)

uva 1346 Songs

题目大意:John Doe 是一个著名的DJ,现在他有n首播放个曲, 每首歌曲有识别符key,歌曲长度l,以及播放频率q。想在John
Doe 想将磁带上的歌曲重新排列,方便播放,播放所有歌曲有一个复杂度的计算∑(1≤i≤n)q[i] * ( ∑(1≤j≤i)l[j] ), 然后给出S,请输出重新排列后的第S首歌的识别码。

解题思路:贪心。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct song {
	int id;
	double l, f;
};
song s[10005];
int cmp(song a, song b)
{
	return a.f * b.l > a.l * b.f;
}
int main()
{
	int n, S;
	while(scanf("%d", &n) == 1)
	{
		for(int i = 0; i < n; i++)
		{
			scanf("%d%lf%lf", &s[i].id, &s[i].l, &s[i].f);
		}
		scanf("%d",&S);
		sort(s, s + n, cmp);
		printf("%d\n", s[S - 1].id);
	}
	return 0;
}
时间: 2024-10-13 01:41:06

uva 1346 Songs(贪心)的相关文章

UVA - 1346 Songs (贪心+排序)

题意:已知每首歌的标号,长度和播放频率,求一种播放顺序,使得最小,并且输出该播放顺序下第t首歌的标号. 分析: 1.长度越短,播放频率越大的歌排在前面,上式越小. 2.s(i)表示的是当前播放顺序下这首歌是第几个播放. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #inc

UVa 1346 - Songs

题目大意:n张唱片,每张都有长度和频率,要求题目中公式值最小.求一个排序,输出该排序下第m张CD的id. 思路:贪心,长度越长放越后面,频率越低放越后面,所以按len/p去排序即可. #include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;struct CD{ int id; double len; double p;} cd[100000]

【UVA】1346 - Songs(贪心)

根据题意可以得到,长度小,并且频率低的排到前面,所以设 k = l  / q; 之后sort排序就可以 14128675 1346 Songs Accepted C++ 0.029 2014-09-01 11:30:14 #include <iostream> #include <cstdlib> #include <cstdio> #include <string> #include <cstring> #include <cmath&g

uva 1511 - Soju(贪心)

题目链接:uva 1511 - Soju 题目大意:给出两个点集,问说分别从两个点集中取一点的哈夫曼距离最小值.注意一个点集的x坐标小于0,另一个大于0. 解题思路:因为x2一定大于x1,所以对于x这一维,一定是+x2-x1,所以只需要考虑y这一维坐标即可. #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> u

UVa 1617 Laptop (贪心)

题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左端点排,然后再扫一遍,如果第一个区间的右端点和第二个右端点一样, 一定可以相邻,如果不相等,再看是不是与左端点大小关系,如果小于左端点,那么就一定会产生空隙,如果不是小于,就可以,那么端点要向右移动一个单位,其他的也样判断. 代码如下: #include <cstdio> #include <

UVA - 10037 Bridge 贪心

题目大意:有n个人要过桥,每次只能过去两个,且这两个人中至少有一个人要带手电筒,但手电筒只有一个. 每个人都有一个过桥时间,两个人的过桥时间取决于时间长的那个. 问所有人都过桥需要多少时间,怎么过桥 解题思路:贪心,因为所有人都要过桥,且手电筒只有一个,所以要过桥时间短的人把手电筒拿回来. 有两种过桥方式使过桥时间达到最短,假设t1,t2(t1 <= t2)是当前过桥时间最短的两个人,tm,tn是过桥时间最长的两个人,且(tm <= tn) 第一种过桥方式:(不考虑最后一次t1和t2一起过桥)

UVa 11039 (排序+贪心) Building designing

白书上的例题比较难,认真理解样例代码有助于提高自己 后面的练习题相对简单,独立思考解决问题,增强信心 题意:n个绝对值各不相同的非0整数,选出尽量多的数排成序列,使得该序列正负交错且绝对值递增. 解法:先按绝对值从小到大排序,然后第一个数先入队,然后依次比较后面的数,如果和队尾的数符号相反则入队,直到所有的数遍历完为止 这里用了异或运算,因为这里面没有0,所谓符号相同的两个数异或值为正,不同符号的数异或值为负 1 //#define LOCAL 2 #include <algorithm> 3

uva 1442:Cave(贪心)

题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可以多高,就可以知道这个位置最终的高度了.方法是扫两次.每次扫的时候,定义一个之前最高值.若之前最高值高于现在的顶,则下降至顶.若低于底,则上升至底(因为后面的这种高度能被这个底挡住).如果在中间则不用变. 代码: #include <cstdio> #include <cstring>

UVA - 1612 Guess 贪心

题目大意:有n个选手参加比赛,题目共有三道,现在给出n个选手每道题的得分和最后的排名,(每道题的得分依据最后检查是否通过来给分,如果没通过得0分,通过得到相应分),问最后一名选手能得到的最高分是多少.(得分相同,ID小的排前面) 解体思路:要最高分,那第一名肯定要三道题都对.维护一个最高分和上一个人的ID号 接着判断一下下一名的得分,如果有得分相同的情况下,就判断一下ID号 如果当前这个人的ID号比较大,就只需要更新ID就可以了 如果没有得分相同的或者得分相同ID号比上一个人小,就找得分最大的且