第七届福建省大学生程序设计竞赛

B:计算得分的期望

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int T;
    int n;
    int cmp=0;
    int a[10010];
    int b[10010];
    cin>>T;
    while(T--)
    {
        scanf("%d",&n);
        cmp++;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&b[i]);
        sort(a,a+n);
        sort(b,b+n);
        int id1=0;
        int id2=0;
        double res=0;
        for(int i=0;i<n;i++)
        {
            res+=lower_bound(b,b+n,a[i])-b;
        }
        printf("Case %d: %.2f\n",cmp,res/n);
    }
    return 0;
}

E:直接根据牌的数量来计算,直接拿n*0.5就是答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#define iloveu return 0
#define wangxingyi main
using namespace std;
int wangxingyi(){
         int t;
         cin>>t;
         int cs=1;
         while(t--)
         {
            int m;
            int a;
            cin>>m;
            for(int i=-m;i<m;i++)
            scanf("%d",&a);
            printf("Case %d: ",cs++);
            if(m%2==0)printf("%d.00\n",m/2);
            else printf("%d.50\n",m/2);
         }
    iloveu;
}

F:水题

#include<iostream>
#include<cstdio>
#include<cstring>
#define iloveu return 0
#define wangxingyi main
using namespace std;
int wangxingyi(){
         int t;
         cin>>t;
         int cs=1;
         int a[11111];
         while(t--)
         {
            int m;
            int b;
            cin>>m;
            int ans=0;
            for(int i=0;i<m;i++)
            scanf("%d",&a[i]);
            for(int i=0;i<m;i++)
            {
                scanf("%d",&b);
                if(b+a[i]>10)ans++;
             }
            printf("Case %d: %d\n",cs++,ans);

         }
    iloveu;
}

G:按二进制来分

#include<iostream>
#include<cstdio>
#include<cstring>
#define iloveu return 0
#define wangxingyi main
using namespace std;
int wangxingyi(){
         long long er[33];
         er[0]=1;
         for(int i=1;i<33;i++)
         er[i]=2*er[i-1];
         int t;
         cin>>t;
         int cs=1;
         while(t--)
         {
            long long m;
            cin>>m;
            int js=0;
            int zz=0;
            while(m>=er[zz])
            {
                m-=er[zz];
                js++;
                zz++;
            }
            if(m>0)
            {
                js++;
            }
            cout<<"Case "<<cs++<<": ";
            cout<<js<<endl;
         }
    iloveu;
}

J:题意就是在保证每两个点之间有最短路的情况下,去掉剩下的路,求去掉的路的条数。做法就是用floyd求最短路,在这个过程中记录多余的路。然后拿floyd后的地图与初始地图比较,得到答案。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int M[105][105],MM[105][105];
int n,m;
bool vis[105][105];
int main()
{
    int T;
    int t=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(M,inf,sizeof(M));
        int ans=0;
        for(int i=0;i<m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            if(M[u][v]!=inf)ans++;
            if(M[u][v]>w)
            {
                M[u][v]=w;
                M[v][u]=w;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                MM[i][j]=M[i][j];
            }
        }
        memset(vis,false,sizeof(vis));
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(M[i][k]+M[k][j]<=M[i][j])
                    {
                        M[i][j]=M[i][k]+M[k][j];
                    vis[i][j]=true;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<i;j++)
            {
                if(MM[i][j]==inf)continue;
                if(M[i][j]<=MM[i][j]&&vis[i][j])ans++;
            }
        }
        printf("Case %d: %d\n",t++,ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/b_r_e_a_d/article/details/80291404