第12届浙江省大学生程序设计大赛 解题报告

题目连接

1.Ace of Aces

签到题(这道题我们的学长参赛时开场5分钟就过了,全场第一)

#include<iostream>
#include<algorithm>
#define maxn 1005
using namespace std;
int nu[maxn];
void init()
{
    int i;
    for(i = 0;i < maxn;i ++)
        nu[i] = 0;
}
int main(void)
{
    int cas,n,a,flag = 0;
    cin >> cas;
    while(cas --)
    {
        init();
        flag = 1;
        cin >> n;
        for(int i = 0;i < n;i ++){
            cin >> a;
            nu[a] ++;
        }
        int ans = 0,tmp;
        for(int i = 0;i < maxn;i ++)
        {
            if(ans < nu[i]){
                ans = nu[i];
                tmp = i;
            }
        }
        for(int i = 0;i < maxn;i ++)
        {
            if(ans == nu[i] && i !=tmp){
                flag = 0;
                break;
            }
        }
        if(!flag)
            cout << "Nobody" << endl;
        else{
            cout << tmp << endl;
        }
    }
    return 0;
}

2.Team Formation

题目大意:要从n个学生中选出两个参加某比赛,给出每个学生的skill level。若某两个学生的skill level值分别为 a ,b,当a ^ b > max(a,b),该两个学生可以组合参赛。问:共有几种组合方式?

思路:如果遍历所有的可能,那么时间会超。思考:异或的特点是什么?同一位上相同则为0,相异则为1。那么,两个数a b异或,a的位数位l1,b的位数为l2,假设(l1  >= l2),若a的l1位上数字为0,则a^b  < a,否则a^b > a;

也就是说,判断两个数异或只需要根据他们的最高位的情况。bit【i】代表最高位为i的数字的个数。

#include<iostream>
#include <cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
int skill[maxn],bit[32];
void get_bit(int n)
{
   int l = 31;
  while(l >= 0)
    {
        if(n & (1<<l))
        {
            bit[l]++;
            return ;
        }
        l--;
    }
    return ;
}
int main(void)
{
    int i,j,l;
    int cas,n,a,flag = 0;
    int ans ;
    cin >> cas;
    while(cas --)
    {
        memset(bit, 0, sizeof(bit));
        ans = 0;
        cin >> n;
        for(int i = 0;i < n;i ++){
            cin >> skill[i];
            get_bit(skill[i]);
        }
        for(i = 0;i < n;i ++)
        {
            l = 31;
            while(l >= 0)
            {
                if(skill[i] & (1 << l))
                    break;
                l --;
            }
            l --;
            while(l >= 0)
            {
                if(! (skill[i] & (1 << l)))
                    ans += bit[l];
                l --;
            }
        }
        cout << ans <<endl;
    }
    return 0;
}

 

3.

4.

posted on 2016-03-24 16:14  Tob's_the_top  阅读(137)  评论(0编辑  收藏  举报

导航