第二次月赛总结(11.27)

C -The calculation of GPA

Description

每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的。国外大学都是计算GPA(grade point average) 又称GPR(grade point ratio),即成绩点数与学分的加权平均值来代表一个学生的成绩的。那么如何来计算GPA呢?

一般大学采用之计分法

A90 - 100 4 点
B80 - 89 3 点
C70 - 79 2 点
D60 - 69 1 点
E0 - 59 0 点

例如:某位学生修习三门课,其课目、学分及成绩分别为:
英文:三学分、92 分;化学:五学分、80 分;数学:二学分、60分,则GPA的算法如下:

科目 学分 分数 点数 分数×点数 
英文  3    92    4     12
化学  5    80    3     15
数学  2    60    1      2
合计  10   29
29/10=2.9
2.9即为某生的GPA
下面有请你写一个用于计算GPA的程序。

Input

包含多组数据,每组数据的第一行有一个数N,接下来N行每行表示一门成绩。每行有两个实型的数 s,p,s表示这门课的学分,p表示该学生的成绩(百分制)。如果p=-1则说明该学生这门课缺考,是不应该计算在内的。

Output

对每组数据输出一行,表示该学生的GPA,保留两位小数。如果GPA不存在,输出-1。

Sample Input

3
3 92
5 80
2 60

Sample Output

2.90
原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1202
代码:
#include<stdio.h>
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i;
        double a[120],b[120];
        for(i=0; i<n; i++)
        {
            scanf("%lf%lf",&a[i],&b[i]);
            if(b[i]>=90)
                b[i]=4;
            else if(b[i]>=80)
                b[i]=3;
            else if(b[i]>=70)
                b[i]=2;
            else if(b[i]>=60)
                b[i]=1;
            else if(b[i]>=0&&b[i]<60)
                b[i]=0;
        }
        int cnt=0;
        double s=0,k=0;
        for(i=0; i<n; i++)
        {
            if(b[i]==-1)
            {
                cnt++;
                continue;
            }
            s+=a[i]*b[i];
            k+=a[i];
        }
        if(cnt==n||k==0)//此处为坑点
            printf("-1\n");
        else
            printf("%.2lf\n",s/k);
        }
        return 0;
}
ps:此题我个人理解错误导致wrong了13次,我以为K==0时,就是当全部科目的学分都为0时GPA是存在的并且此时最终的答案是0.00。。但是我想错了,k==0就是分母为0,所以GPA不存在。。
D - 字符消除

Description

小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:


1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。

2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A"


游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符('A','B'或者'C'),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。


请帮助小Hi计算要如何插入字符,才能获得最高得分。


Input

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。


Output

对于每一行输入的字符串,输出小Hi最高能得到的分数。


Sample Input

3
ABCBCCCAA
AAA
ABC

Sample Output

9
4
2

Hint

第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。

第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。

第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。

原题链接: https://hihocoder.com/problemset/problem/1039
ps:此题对于目前的我还是有难度的,所以我把它特意弄了出来,详细代码及思路 http://blog.csdn.net/blesslzh0108/article/details/53389145
E - The Marshtomp has seen it all before

Description

14184646038225.jpg

fjxmlhx不喜欢网上的 marshtomps 。所以他决定把所有的 “marshtomp”(名字不区分大小写) 改为 “fjxmlhx;

Input

输入包含多行,每行字符串不超过200的长度,一个单词不会一半出现在上一行,剩下的在下一行。直到文件结束(EOF)

Output

输出 替换之后的字符串。

Sample Input

The Marshtomp has seen it all before.
marshTomp is beaten by fjxmlhx!
AmarshtompB

Sample Output

The fjxmlhx has seen it all before.
fjxmlhx is beaten by fjxmlhx!
AfjxmlhxB
代码:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char a[1010],b[10],c[1010],e[1010];
int main()
{
    char d[]= {"fjxmlhx"};
    while(gets(c))
    {
        memset(e,'\0',sizeof(e));
        int i,lc,j;
        lc=strlen(c);
        for(i=0; i<lc; i++)
            a[i]=tolower(c[i]);//把字符全部转化成小写
        int k=0;
        for(i=0; i<lc; i++)
        {
            if(i+9<=lc)
            {
                int ans=0;
                memset(b,'\0',sizeof(b));
                for(j=i; j<i+9; j++)//找到连续的长度为9的字符串
                    b[ans++]=a[j];//注意ans要从0开始即要让b的下标从0开始,不然的话会出错的
                ans=0;
                if(!strcmp(b,"marshtomp"))//判断此字符串是否等于marshtomp
                {
                    for(j=i; j<i+7; j++,ans++)
                        e[k++]=d[ans];
                    i+=9;
                }
            }
            e[k++]=c[i];
        }
        puts(e);//坑点就是最后一次输出并没有换行,所以用了puts
    }
    return 0;
}
ps:此题倒是没有什么难的,但是由于以前很少写字符串的题,所以比赛时做这道题也是费了点时间。。
F - 买零食

Description

小Ho很喜欢在课间去小卖部买零食。然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰霜著称。第一次去一教小卖部买零食的时候,小Ho由于不懂事买了好一大堆东西,被小卖部姐姐给了一个“冷若冰霜”的眼神,食欲都下降了很多。

从那以后,小Ho就学乖了,去小卖部买东西只敢同时买3包以内的零食,并且价格加起来必须是5的整数倍,方便小卖部姐姐算价格。

但是小Ho不擅长计算,所以他把小卖部里所有零食的价格以及他对这个零食的渴望度都告诉了你,希望你能够帮他计算出在不惹恼小卖部姐姐的前提下,能够买到零食的渴望度之和最高是多少?

Input

每个输入文件包含多组测试数据,在每个输入文件的第一行为一个整数Q,表示测试数据的组数。

每组测试数据的第一行为一个正整数N,表示小卖部中零食的数量。

接下来的N行,每行为一个正实数A和一个正整数B,表示这种零食的价格和小Ho对其的渴望度。

一种零食仅有一包。

对于100%的数据,满足1 <= Q <= 10,1<=N<=50,0<A<=10,1<=B<=100。

对于100%的数据,满足A的小数部分仅可能为0.5或0。

Output

对于每组测试数据,输出一个整数Ans,表示小Ho可以获得最大的渴望度之和。

Sample Input

1
4
0.5 6
4.5 7
5.0 4
2.0 9

Sample Output

17
原题链接: https://hihocoder.com/problemset/problem/1272
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct zxc
{
    double x;
    int y;
} a[1010];
bool cmp(struct zxc a,struct zxc b)
{
    return a.y>b.y;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,i;
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%lf%d",&a[i].x,&a[i].y);
        }
        sort(a,a+n,cmp);
        int j,k,s,maxn=0;
        for(i=0; i<n; i++)
        {
            for(j=i+1; j<n; j++)
            {
                for(k=j+1; k<n; k++)
                {
                    s=0;
                    if((int)(a[i].x+a[j].x+a[k].x)==(a[i].x+a[j].x+a[k].x))//先判断是否是整数
                    {
                        if(!((int)(a[i].x+a[j].x+a[k].x)%5))//判断是否满足条件是5的倍数
                        {
                            s=a[i].y+a[j].y+a[k].y;
                        }
                    }
                    if(s>maxn)
                    {
                        maxn=s;
                    }
                }
                s=0;
                if((int)(a[i].x+a[j].x)==a[i].x+a[j].x)//同上
                {
                    if(!((int)(a[i].x+a[j].x)%5))//同上
                        s=a[i].y+a[j].y;
                    if(s>maxn)
                        maxn=s;
                }
            }
            s=0;
            if(a[i].x==(int)a[i].x)//同上
            {
                if(!((int)(a[i].x)%5))//同上
                    s=a[i].y;
                if(s>maxn)
                    maxn=s;
            }
        }
        printf("%d\n",maxn);
    }
    return 0;
}

ps:这是一道贪心题,不过我用的是最笨的方法,原谅我由于时间紧迫,还是这个代码,比较容易懂,以后复习时会优化这个代码的。。

G - Radar Installation

Description

我们假设海岸是无限延伸的直线,陆地在海岸的一边,大海在另一边。每个小岛是一个点位于大海那一片区域。详见图片;

每一个雷达的安装位置只能够在海岸线上,只能够覆盖半径为 d 的圆形区域。所以,如果小岛与雷达距离小于等于d才能够覆盖。

我们可以用笛卡尔积坐标系,定义海岸线是 x轴,大海在x 上方,陆地在x 轴下方,给你每个小岛在大海中的位置,并且给出雷达的覆盖范围 d ,你的任务是写一个程序,找到最少需要安装的雷达数量且能够覆盖所有的小岛。一个位置表示 (x,y )坐标。


Figure A Sample Input of Radar Installations


 

Input

输入是多组 句输入;
每行包含两个数 n 和 d;
n 代表小岛的数量,d 代表雷达的覆盖半径;
接下来n行是小岛的位置,用一个二维坐标来表示 XiYi ;
当输入的 n 和 d 都为0, 程序结束。

Output

对于每组数据输出一个答案,每个答案占一行,输出最小需要的雷达数量,如果不能够满足要求,则输出 -1;

输出格式为:详见样例输出格式。

Sample Input

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

Case 1: 2
Case 2: 1
原题链接: http://poj.org/problem?id=1328
ps:这道题以前写过,所以当第一个A出这道题时感觉还是很高兴的。。
原谅偷懒一下,详细思路及代码: http://blog.csdn.net/blesslzh0108/article/details/53220553
I - The Frog's Games

Description

青蛙举行了运动会,要求青蛙跳跃小河。河流宽度为 L (1<= L <= 1000000000). 河里会有 n 个石头沿着垂直于河岸的直线排成一排,青蛙以跳到石头上,然后再次跳跃。青蛙最多能够跳 m 次;现在青蛙们想知道他们最少应该有多大的跳跃能力才能够到达河对岸?

Input

多组数据;

每行输入   L,n,m;

接下来输入n个数,代表第 i 个石头距离开始位置的距离,两个石头不可能出现在一起。

Output

输出一个数,代表至少需要的跳跃距离(最小的最大跳跃能力);

Sample Input

6 1 2
2
25 3 3
11 
2
18

Sample Output

4
11
原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=4004
ps:这道题用了二分的思想,比赛的时候完全没想到,真的是一脸懵逼。。为它来个特写

ps:其他题都比较基础,所以就不贴上来了。。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值