2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛总结

比赛链接:点这里

题目:

Problem A: pigofzhou的巧克力棒

Description

众所周知,pigofzhou有许多妹子。有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们。具体地,这根巧克力棒长为 n,他想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后分给妹子们。
但是他妹子之一中的 15zhazhahe 有强迫症。若它每次将一根长为 k 的巧克力棒折成两段长为 a 和 b 的巧克力棒,此时若 a=b,则15zhazhahe会得到一点高兴值。
pigofzhou想知道15zhazhahe最多能获得多少高兴值。

Input


输入数据为T组(T <= 10000),每组数据读入一个n(n<=1000000000)

Output

一行一个整数代表能获得的最大高兴值

Sample Input

15

Sample Output

3
代码:

思路:好吧,我承认这道题我做的复杂了。。时间复杂图太高,这道题和下一道题一模一样,甚至代码都不用改,但是我的这个代码交到B题会超时,规律是2的n次方的时候,是2的n次方减1

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int cifang(int n)//计算2的n次方
{
    int sum=1;
    while(n--)
    {
        sum*=2;
    }
    return sum;
}
int a[35];
int main()
{
    int q=1;
    for(int i=1; i<=30; i++)
    {
        a[q++]=cifang(i);
    }//打一张表,2的0次方到2的30次方
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int sum=0;
        while(n>0)
        {
            if(n==1)
            {
                break;
            }
            for(int i=1; i<=30; i++)//循环2的次方数
            {
                if(n==a[i])//如果n恰好等于2的某一个次方
                {
                    sum+=a[i]-1;//次数正好加上它-1
                    n-=a[i];//更新n的值
                    break;
                }
                if(n<a[i]&&n>a[i-1])//在2的n-1次方与2的n次方之间
                {
                    sum+=a[i-1]-1;
                    n-=a[i-1];
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

Problem B: Zhazhahe究竟有多二

Description

Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个nn!表示zhazhahe的脑残值。

Input

输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18)n!表示zhazhahe的脑残值

Output

输出一个正整数表示zhazhahe二的程度

Sample Input

32415

Sample Output

1311

HINT

思路:

仔细读题,会发现这道题和第一道题有什么区别,完全没有嘛。。,但是你用下面的代码交一下A题,然后就神奇的过了,

其实两道题的规律都是2的n次方的时候是2的n次方减1

#include<stdio.h>
int main()
{
    long long int t;
    scanf("%lld",&t);
    while(t--)
    {
        long long int n,s=0;
        scanf("%lld",&n);
        while(n)
        {
            s+=n/2;
            n/=2;
        }
        printf("%lld\n",s);
    }
}

Problem C: 剁手女生节

Description

由于女生节准备到了,ming打算给班上女生送一份大礼。没错,就是数学练习册!
ming先前就已经收藏了 n 本练习册了,一直不舍得做,这次突然决定把它们都拿出来当作礼物送出去!
但是,ming班上一共有 4 个女生,为了不要显得自己偏爱哪一个,他觉得每个女生都应该分到同等数量的练习册。
这样的话,原来的 n 本就可能不太够了。于是他去逛亚马当商城。
他发现,最近ACM(Association of Counting Method)又出版了好多新版数学练习册:高数、线代、离散、概率论…
而且商店有三种促销优惠套餐:
第一种:任选 1 本练习册,送欧几里德主题套尺。只需 a 个比特币;
第二种:任选 2 本练习册,送莱布尼兹同款2B铅笔。只需 b 个比特币;
第三种:任选 3 本练习册,送爱因思坦专用橡皮擦。只需 c 个比特币。
那么问题来了:吃土ming如何用最少的比特币购买若干本练习册,使得全部(包括原来的n本)可以平分给四个女生?

Input

每组输入是一行四个整数:n,a,b,c(1 <= n,a,b,c <= 1e9)意思如题目描述。

Output

对每组输入,输出一行一个整数,表示ming要花的最少的比特币数。

Sample Input

31 1 3 46 2 1 14 4 4 4

Sample Output

310

思路:这道题一共三种情况,水过

代码:

#include<stdio.h>
#include <algorithm>
#define ll long long int
using namespace std;
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        ll n,a,b,c;
        scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
        if(n%4==0)
            printf("0\n");
        else
        {
            ll x=(4-(n%4));
            if(x==1)printf("%lld\n",min(min(a,c*3),c+b));
            if(x==2)printf("%lld\n",min(min(2*a,b),c*2));
            if(x==3)printf("%lld\n",min(min(3*a,a+b),c));
        }
    }
    return 0;
}

Problem D: 勤奋的涟漪2

Description

涟漪进入集训队后,他会去实验室训练或者去操场锻炼。 接下来n天,每天的情况是一下4种中的一种: 1.当天体育馆关门了和没有训练赛 2.当天体育馆关门了和有训练赛 3.当天体育馆开放和没有训练赛 4.当天体育馆开放和有训练赛 涟漪知道之后n天的情况。 涟漪每一天可以休息,或者打训练赛(当天有训练赛)或者运动(当天体育馆开放)。 涟漪要制定一个训练计划,决定每天干什么,但是涟漪不会连续两天都运动或者连续两天都打训练赛, 请帮涟漪找出她最少休息的天数(她不打训练赛和运动)。 休息的时候,她会做下面的数学题

Input

第一行一个整数t(t<=100),代表测试数据, 第二行一个整数 n(1<=n<=100) 第三行有n个数a1,a2,a3,....an(0<=ai<=3)) ai=0 ,代表第一种情况 ai=1,代表第二种情况 ai=2 ,代表第三种情况 ai=3 ,代表第四种情况

Output

输出 一个数 表示(涟漪休息的天数) 乘以(数学题的答案的积)。

Sample Input

471 3 3 2 1 2 3111213

Sample Output

0000
思路:看注释

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[110];
int n;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {

        scanf("%d",&n);
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        int sum=0;
        for(int i=0; i<n; i++)
        {
            if(a[i]==3)//体育馆和训练赛都能参加
            {
                if(a[i-1]!=3)//如果上一天的状态不是都开门
                    a[i]=3-a[i-1];//转换状态
            }
            else
            {
               if(a[i]==a[i-1])
                {
                      a[i]=0;//状态已经转换了,这一项和前一项相等时就标记为0
                }

            }
        }
        for(int i=0; i<n; i++)
        {
            if(a[i]==0)
                sum++;
        }
        printf("%d\n",sum*(-24));

    }
    return 0;
}
/* **********************************
     体育馆     训练赛            ***
 0     0          0               ***
 1     0          1               ***
 2     1          0               ***
 3     1          1               ***
** *********************************/

Problem E: 穷游中国在统题

Description

Travel_poorly队是广工大目前最年轻的金牌队伍,队内成员分别是tmk、YFQ、Maple。这天他们接到教练的order要给新生杯统题,统题是个不轻松的工作,要评估各个题目的难度,设计出一套有梯度的套题,使得做题的情况有区分度。tmk很快想出了解决的办法,他给每道题目都设置了一个难度值,然后按照难度值进行筛选题目,这时候他发现难度值刚开始有可能是无序的,于是他决定要让全部题目都按照难度值从小到大排好序。 这时候YFQ说让他来排序,排序是一个展现算法魅力的过程,他要通过一种有趣的方法来给题目的难度值排序: 首先他把题目划分成很多组,每组的题目都是连续的,例如某一组包含从i到j的题目,那么这一组包含的是第i,i+1,i+2,i+3,...,j题。 这样每道题都属于某一个组,然后他再到组内把题目按照难度值进行从小到大排序。 当每个组内都进行排序之后,最终全部题目的难度值将按照从小到大的顺序排列好。 我们知道每一组里面的题目越多,排序的压力就越大,所以Maple提出一个合理的要求,就是让每个组里面的题目数量尽可能的少,聪明的ACMer,你知道Travel_poorly一共要分出多少个组吗?

Input

第一行是一个整数t ( t<= 10 ),表示有t组数据。在每组数据中: 第一行是一个整数n ( n<=1000 00 ),表示题目的总数; 第二行是n个整数A1,A2,A3...An ( 0<=Ai<= 1000 000 000),表示每道题目的难度值

Output

对于每组数据,输出一个正整数,表示一共要分出多少个组能满足Travel_poorly的要求,每两组样例之间输出一个空行。

Sample Input

253 2 5 4 655 4 3 2 1

Sample Output

31

思路:好吧。。。我不会 抓狂


Problem H: 《为什么会变成这样呢》

Description

“第一次有了喜欢的人,还得到了一生的挚友,两份喜悦互相重叠,这双重的喜悦又带来了更多更多的喜悦,本应已经得到了梦幻一般的幸福时光,然而,为什么,会变成这样呢?”双重的喜悦感却无法带来更多的幸福,现在,雪菜在很多喜悦感之中只想要得到两份不重叠的喜悦感(其他的喜悦感都是重叠的),你能帮她找出这两份不同的喜悦感是多少吗?

Input

第一行一个整数T,代表数据的组数(1<=T<=10),接下来T组数据,每组数据的第一行是一个整数n(1<=n<=1000000),第二行是n个整数ai(0 <= ai <= 1000000000)代表喜悦感,每两个整数之间有一个空格,题目保证有且仅有两个不同的整数出现一次,其他的整数都是出现两次。

Output

对于每组数据,输出两个整数,分别代表两份不同的喜悦感,中间有一个空格,并且喜悦感较小的先输出。

Sample Input

262 2 1 1 3 441 1 3 4

Sample Output

3 43 4

思路:注释就不写了把,应该都能看懂,用了队列,还好这个题只有两个不一样的。。

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        queue<int>s;
        int n;
        int k;
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {

            scanf("%d",&k);
            if(!s.empty())
            {
                if(k==s.front())
                    s.pop();
                else
                    s.push(k);
            }
            else
            {
                s.push(k);
            }
        }
        int a=s.front();
        s.pop();
        int b=s.front();
        s.pop();
        printf("%d %d\n",min(a,b),max(a,b));
    }
    return 0;
}
ps:至于F(输出ac),G(求组合数)有点水,就不在这贴上来了,J题直接打表,I题么。。这个不会做,它的后台数据有问题,随便交个代码都能过,也不能判断代码的正确性,就不弄了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值