LA 3303 / POJ 2675 Songs (数学证明+排序)

来源:互联网 发布:网络与新媒体专科 编辑:程序博客网 时间:2024/06/07 16:26

题目链接:http://poj.org/problem?id=2675


题目大意:给定n首歌,求出一种放歌顺序使得下图中的式子值最小,s(i)代表每首歌的标号,f(s(i))表示编号为s(i)的歌播放频率,l(s(i))表示编号为s(i)的歌的播放时长,询问第s首歌的编号。



思路:假设某两首歌A和B,要确定A和B的播放前后关系,假设A要在B之前播放,则有,A.len * A.fre + (A.len + B.len) * B.fre < B.len * B.fre + (A.len + B.len) * a.fre ,化简得A.len * B.fre < B.len * A.fre ,则可以按这种规则对歌曲排序获得最优值。


Code:


/*   W          w           w        mm          mm             222222222       7777777777777    *//*    W        w w         w        m  m        m  m          222        22              7777    *//*    w        w w         w        m  m        m  m                     22              777     *//*     w      w   w       w        m    m      m    m                    22              77      *//*     w      w    w      w        m    m      m    m                 222                77      *//*      w    w      w    w        m      m    m      m              222                  77      *//*      w    w      w    w        m      m    m      m            222                    77      *//*       w  w        w  w        m        m  m        m         222                      77      *//*       w  w        w  w        m        m  m        m      222                         77      *//*        ww          ww        m          mm          m     222222222222222             77      *///#pragma comment(linker, "/STACK:102400000,102400000")//C++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %%esp\n" :: "r"(p));//G++#include<set>#include<map>#include<queue>#include<stack>#include<ctime>#include<deque>#include<cmath>#include<vector>#include<string>#include<cctype>#include<cstdio>#include<cstdlib>#include<cstring>#include<sstream>#include<iostream>#include<algorithm>#define REP(i,s,t) for(int i=(s);i<=(t);i++)#define REP2(i,t,s) for(int i=(t);i>=s;i--)using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned long ul;const int N=150000;int n;struct song{  int id;  double len,fre;  bool operator < (const song& A) const  {    return len*A.fre<A.len*fre;  }}s[N];int main(){  #ifdef ONLINE_JUDGE  #else    freopen("test.in","r",stdin);  #endif  while(~scanf("%d",&n))  {    REP(i,1,n)    {      scanf("%d%lf%lf",&s[i].id,&s[i].len,&s[i].fre);    }    int Q;    scanf("%d",&Q);    sort(s+1,s+1+n);    printf("%d\n",s[Q].id);  }  return 0;}


                                             
0 0
原创粉丝点击