2016年第四届湘潭大学新生趣味程序设计竞赛 题解

湘潭OJ:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1253

Age

题目描述

今年是2016年,一个年龄小于99岁(出生当年为0岁)的人,把出生年份的前两位和后两位相加得到一个整数 n 。你能根据n,算出他有多少岁吗?

输入

第一行输入一个整数 T(1T99) ,表示样例的个数。 每行输入一个整数 n

输出

每行输出一个样例的结果。

样例输入

2
20
118

样例输出

16
17

样例解释

第1样例,此人生于2000年;第2样例,此人生于1999年。


题解:题意思路是直接从2016年递减下去,将每个年份的前两位和后两位提取出来,再相加,与输入的数字进行比较,最后做差,得出结果


#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
    int n,m;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(int i=2016;i>0;i--)
        {
            int a = i / 100;
            int b = i % 100;
            if(a + b == m)
            {
                int temp = 2016 - i;
                cout << temp << endl;
                break;
            }
        }
    }
    return 0;
}

Gemstone Bracelet

题目描述

mumuchacha是一个爱美的小姑娘,她有一条漂亮的宝石手链,宝石手链上有N个不同的宝石,每一颗宝石都有它特定的魅力值。

mumuchacha每天都把手链戴在手上,她很喜欢抬起手来看她的手链,但是每次都只能看到一部分(M个宝石),因为还有一部分被手臂挡住了,所以她不断的旋转手链,每次转动一颗宝石,使每次看到的宝石都不同,求mumuchacha每次旋转后看到的宝石魅力值之和的最大值。

输入

有多个样例,输入的第一行是样例个数 T
每个样例的第一行是两个整数 n m (1mn100000)
第二行是 n 个整数 ai ,表示 n 个宝石的魅力值 (1ai10000)

输出

每行输出一个整数,即魅力值和的最大值

样例输入

2
5 3
1 2 3 4 5
10 4
6 7 4 5 8 4 2 5 9 4

样例输出

12
26
#include <cstdio>
#include <iostream>
using namespace std;

int a[110000];
int n,c,b,count,sum;

int main()
{
    while(scanf("%d",&n) != EOF)
    {
        while(n--)
        {
            int max = 0;
            count = 0;
            scanf("%d%d",&c,&b);
            for(int i=0;i<c;i++)
            {
                scanf("%d",&a[i]);
            }
            for(int i=0;i<b-1;i++)
            {
                a[c+i] = a[i];
            }
            for(int i=0;i<c;i++)
            {
                int ans = i;
                sum = 0;
                for(int j=0;j<b;j++)
                {
                    sum += a[ans++];
                }
                if(sum > max)
                {
                    max = sum;
                }
            }
            printf("%d\n",max);
        }
    }
    return 0;
}

题解:每次只能从n个宝石中看到m个宝石,思路用数组的方式,从后面补m-1个开头的数,然后直接遍历数组,得出最大值;这题其实挺水的 不过我多重样例没看到,贡献了七发WA才过,一直本地编辑通过,一审核就错误,以后还是要细心读题


Finally, which light is on?

题目描述

有n盏灯,编号1~n。一开始灯都是关着的,每个灯有一个开关,按奇数次为打开,按偶数次为关闭。我们先把编号为1的倍数的灯按一下开关,再把编号为2的倍数的灯按一下开关,依次下去,一直到把编号为n的倍数灯按一下,请问最后有多少盏灯是亮的?

lamp

输入

第一行是一个整数 T(1T10000) ,表示样例的个数。 以后的每行一个样例,为一个整数 n(1n109)

输出

每行输出一个样例的结果。

样例输入

2
1
5

样例输出

1
2

样例解释

第2个样例,先把1~5都打开;然后把2,4关掉;然后把3关掉;然后把4打开;然后把5关掉;所以,最后剩1和4是亮着的。


题解:刚开始每盏灯都是熄灭的,1的倍数是将所有灯都打开,然后2的倍数关闭……以此类推;

思路:刚开始我是直接想暴力解的,用数组解决,不过提交就直接TLE了,后来回来再想一下,打了一个表看一下,结果发现规律很明显,1,4,9的时候才会增加灯的数量,所以直接开根号,AC;


#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int a[1<<10];

int main()
{
    int t,n,first;
    while(scanf("%d",&t) != EOF && t)
    {
        while(t--)
        {
            memset(a,0,sizeof(a));
            int count = 0;
            scanf("%d",&n);
            int temp = sqrt(n);
            printf("%d\n",temp);
            /*
            a[1] = 1;
            for(int i=1;i<=n;i++)
            {
                for(int j=2;j<=n;j++)
                {
                    if(j % i == 0)
                    {
                        a[j] = !a[j];
                    }
                }
                /*
                for(int i=1;i<=n;i++)
                {
                    cout << a[i] << " ";
                }
                cout <<endl;

            }

            for(int i=1;i<=n;i++)
            {
                if(a[i])
                {
                    count ++;
                }
            }
            printf("%d\n",count);
            */
        }
    }
    return 0;
}


Estrella's Travel

题目描述

Estrella喜欢旅行,她准备去自己心仪的城市看风景。她精心选择了一条线路,准备自驾游。自驾线路是一条链路,上有 n+1 座城市,编号依次为 0n ,Estrella住在 0 号城市,目的地是 n 号城市。Estrella为了环保,驾驶了一辆纯电动车,所以最多只能一次行驶 m 个城市的距离。如果Estrella在某个城市(包括 n 号城市)停留,自然会需要一些费用,当然每个城市的花费是不一样,Estrella想知道,这个花费最小是多少?

输入

多组数据输入。
每组数据第一行两个整数 n(1<n<1000),m(1m<n)
第二行 n 个整数 ai(0<ai1000) ,表示编号为 1,2,,n 的城市的停留花费。

输出

对于每个数据,输出一行,表示总的花费。

样例输入

5 2
1 2 3 4 5
6 2
6 5 4 3 2 1

样例输出

9
9

样例解释

第1个样例,依次到城市1,3,5,所以花费为1+3+5=9;
第2个样例,依次到城市2,4,6,所以花费为5+3+1=9。


题意:从出发开始,每个城市都可以停留,停留就要有相应的花费,每次的路过城市是m以内,求最小的花费值;

思路:很明显的dp题目,不过还是贡献了2发WA,直接dp考虑一下边界的问题


#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;

const int INF = 1 << 29;
int a[1005],dp[1005];

int main()
{
    int n,m,sum;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        dp[0] = 0;
        for(int i=1;i<n;i++)
        {
            sum = INF;
            if(i >= m)
            {
                for(int j=i-m;j<i;j++)
                {
                    sum = min(sum,dp[j]);
                }
                dp[i] = sum + a[i];
            }else {
                for(int j=0;j<i;j++)
                {
                    sum = min(sum,dp[j]);
                }
                dp[i] = sum + a[i];
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}

Clock

题目描述

钟的一圈是12小时,其中时针、分钟都是匀速移动。一天从00:00~23:59,请问某一时刻,时针与分针的夹角是多少?

Clock

输入

第一行是一个整数 T(1T1440) ,表示样例的个数。 以后每行是一个时刻,格式为HH:MM。

输出

每行输出一个样例的结果,如果结果不是整数,小数部分不要输出多余的0。

样例输入

2
00:01
00:30

样例输出

5.5
165
题意:输入时间,求夹角度数,注意double;

思路:直接套公式,如果时针大于12 做差,然后时针乘于30减去分针乘于5.5      h*30-m*5.5,取double值,注意最后与180比较 大于180要做差!!因为这个贡献了2发


#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int n,a,b;
    double h,m,ans;
    while(scanf("%d",&n) != EOF)
    {
        while(n--)
        {
            scanf("%d:%d",&a,&b);
            if(a >= 12)
            {
                a -= 12;
            }
            h = a * 30;
            m = b * 5.5;
            ans = fabs(h - m);
            if(ans > 180.0)
            {
                ans = 360 - ans;
            }
            cout << ans << endl;
        }
    }
    return 0;
}

分界线

还有两道题,想了很久都没有思路,不知道他到底是什么意思,所以一直没有去开后面两道题,后来结束了去找了一下题解看,


Balance

题目描述

小明有一架天平,小明想称出 1n 克的物品,请问最少需要几颗砝码?
比如小明想称出 14 克的物品,需要2颗砝码,为1和3克。

balance

输入

第一行是一个整数 T(1T10000) ,表示样例的个数。 以后每行一个样例,为一个整数 ( 1n109 )。

输出

每行输出一个样例的结果。

样例输入

3
1
4
40

样例输出

1
2
4
题解:这个还是到现在也不能理解到底是什么意思,贪心还是什么,完全都看不懂怎么秤才行,代码后续补




Different Digits

题目描述

有一个 n 位数 x ,每个数码都不一样,可你知道 x 的后 m(m<n) 位构成的整数 x ,请问满足条件最小的 x 是多少?

输入

第一行是一个整数 T(1T1000) ,表示样例的个数。 每个样例一行,为两个整数 n(2n10) x 的后 m 位的整数 x(0x<987654321,x0)

输出

每行输出一个样例的结果。

样例输入

2
3 12
4 12

样例输出

312
3012
题意:找出最小的n位数,且每个数不能相同,即坐一下标记

思路:当初的时候跟上一题差不多,这个是看出题意,却有点纠结不知道怎么下手,后来也是看了题解,即每个最高位数给能给的最小的数,然后标记一下

这题没有AC 代码候补……



分界线

总结:学校不给考四级,心情压抑,晚上做一下这种题,看到很多大神1小时左右AK了,真心觉得自己太水,高不成低不就,跟以前老师说的一样,有点眼高手低了,两道题连思路都没有,真心觉得自己太差了,题目数还是不够多,日后还需要恶补,浪费太多时间再无意义的事情上真是觉得没意思。

额 至于这么迟补题解是因为接下来是考试月,很多科目要考察,一直在赶作业,所以题解来的迟,也提醒自己别什么都堆到最后,会导致挺多问题的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值