#164 (Div. 2)

A. Games

题意:有n个球队,两个之间会有比赛,每个球队有主场和客场的衣服并且颜色不同,当在自己主场比赛时,如果对方衣服和主场衣服颜色一样,就要穿客场衣服,问最多有多少场这样的情况。

分析:直接暴力。

View Code
#include <stdio.h>
#include <string.h>
int h[33], a[33];
int main()
{
    int n,i, j;
    while (scanf("%d",&n)!=EOF)
    {
        for (i=0; i<n; i++)
            scanf("%d %d",&h[i],&a[i]);
        int res = 0;
        for (i=0; i<n; i++)
            for (j=0; j<n; j++)
                if (h[i] == a[j])
                    res++;
        printf("%d\n",res);
    }
    return 0;
}

 

B. Buttons

题意:有n个按钮,一个密码的破译要求每个按钮按一次,如果按对了那个按钮就陷下去,否则所有按钮还原,问最多按多少次按钮可以破译密码。

分析:简单数学题。

View Code
#include <stdio.h>
int main()
{
    int tot;
    int n;
    int i;

    while (scanf("%d",&n)!=EOF)
    {
        tot = 0;
        for (i=1; i<n; i++)
            tot += i*(n-i);
        printf("%d\n",tot+n);       
    }
    return 0;
}

 

C. Beautiful Sets of Points

题意:给出一个n,m,找出一个点的集合(x,y)满足0<=x<=n且0<=y<=m且几何内任意两点的距离不是整数。’

分析:每个点都要占据一行和一列,这样下来最多能放Min(n,m)+1个点,而这些点只要在对角线上就能满足。

View Code
#include <cstdio>
int main()
{
    int n, m;
    int i;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        if (n>m)
            n = m;
        printf("%d\n",n+1);
        for (i=0; i<=n; i++)
            printf("%d %d\n",i,n-i);
    }
    return 0;
}

 

E.Playlist

题意:有n首歌曲,知道了每首歌曲的播放时间和喜欢的概率,如果听到歌是喜欢的就会记录下来然后接着往下听,如果是不喜欢的就把之前喜欢的歌全部听一遍,歌曲的顺序可以     任意调整,问最长的收听时间的期望是多少。

分析:贪心+排序+概率

        假设有两首歌,第一首歌时间为a,喜欢概率为x,第二首歌时间为b,喜欢概率为y

        若收听顺序为ab,那么这两首歌收听总时间为a+b+a*x*(1-y)

        若收听顺序为ba,那么这两首歌收听总时间为a+b+b*y*(1-x)

        所以可以先按照a*x*(1-y)从小到大排序

       求概率的时候设两个数组,

        p[i] 表示前 i 首歌收听时间的期望值 ,则有                       p[i] = v[i].pr * (p[i-1]+v[i].ti) + (1-v[i].pr) * (p[i-1]+v[i].ti+l[i-1])

        l[i]  表示前 i 首歌中喜欢的歌的时间总长度的期望值,则有    l[i] = v[i].pr * (l[i-1]+v[i].ti) + (1-v[i].pr) * l[i-1]

View Code
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

struct pla
{
    double ti, pr;
    bool operator <(const pla& x) const{
        return ti*pr*(1.0-x.pr) > x.ti*x.pr*(1.0-pr);
    }
};

double p[50005];
double l[50005];
int main()
{
    //freopen("data.in","r",stdin);
    double ti,pr;
    int i, j;
    int n;
    while (scanf("%d",&n)!=EOF)
    {
        vector<pla>v;
        for (i=0; i<n; i++)
        {
            scanf("%lf %lf",&ti,&pr);
            pr /= 100.0;
            v.push_back((pla){ti,pr});
        }
        sort(v.begin(),v.end());

        p[0] = l[0] = 0;
        for (i=1; i<=n; i++)
        {
            p[i] = v[i-1].pr*(p[i-1]+v[i-1].ti)+(1.0-v[i-1].pr)*(p[i-1]+v[i-1].ti+l[i-1]);
            l[i] = v[i-1].pr*(l[i-1]+v[i-1].ti)+(1.0-v[i-1].pr)*l[i-1];
        }
        printf("%.9lf\n",p[n]);
    }
    return 0;
}

 

posted @ 2013-02-05 00:33  'wind  阅读(268)  评论(0编辑  收藏  举报