2015.6.28 HNCU第一次选拔赛 弱爆了

第一次的比赛,实在是有点水 只出了1道题 




先看看排名 第6....





先开始做1001 ~


1215 七夕节

七夕节

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34839    Accepted Submission(s): 10919


Problem Description
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:



数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
 

Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
 

Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
 

Sample Input
  
  
3 2 10 20
 

Sample Output
  
  
1 8
22
 


这道题有坑点,做的时候各种超时,之前没接触这种超时的题,也不知道怎么解决,连错11回合,这个时候大家基本上都在做这道题,1个小时还没人A出一道题,顿时倍受打击,于是去找后面的简单题,老廖竟然悠哉悠哉地说,这是给我们下马威,我们无力吐槽........

附上代码 

/*#include<stdio.h>//涛哥代码
int main (void)
{
    int n,sum,i,a,k;
    scanf("%d",&n);
    while(n--&&scanf("%d",&a))
    {
        sum=0;
        for(i=1; i*i<=a; i++)
        {
            if(a%i==0)
            {
                sum+=i+a/i;
            }
            if(i*i==a)
            {
                sum-=i;
            }

        }
        printf("%d\n",sum-a);
    }
    return 0;
}


*/
//自己的代码
/*
#include<stdio.h>
int main (void)
{
    int n,sum,i,a,k;
    scanf("%d",&n);
    while(n--&&scanf("%d",&a))
    {
        sum=0;
        for(i=1; i*i<=a; i++)
        {
            if(a%i==0)
            {
                sum+=i;
                k=a/i;
                if(k==1||k==a)
                {
                    ;
                }
                else
                {
                    sum+=k;
                }
                if(k==i)
                {
                    sum-=k;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
*/

//打表
#include<stdio.h>
#include<string.h>
int hash[500010];
int biao (void)
{
    int i,j;
    memset(hash,0,sizeof(hash));
    for(i=1; i<=500000/2; i++)
    {
        for(j=2; j*i<=500000; j++)
        {
            hash[j*i]+=i;
        }
    }
}
int main(void)
{
    biao();
    int n,a;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&a);
        printf("%d\n",hash[a]);
    }
    return 0;

}


接着把后面几道题扫了一遍以后去做1004 

1202 GPA 

The calculation of GPA

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 22866    Accepted Submission(s): 5306


Problem 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

那个鬼 ,很简单的题,但是想得太简单了,连态度没看清楚,输入的时候要用实型  double 大家基本上都在用int ,球哥尤为突出,大战37回合,还是没A出来 ,哈哈哈,我做了几遍之后,发现这道题一定有坑点,果断放弃,扫其他各种题目,其实事后发现自己对题目的理解有问题,思路都是错的。

过一会学姐提醒有人A出了1008 ,挺简单的

分数矩阵

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5312    Accepted Submission(s): 3146


Problem Description
我们定义如下矩阵:
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。
请求出这个矩阵的总和。
 

Input
每行给定整数N (N<50000),表示矩阵为 N*N.当N为0时,输入结束。
 

Output
输出答案,保留2位小数。
 

Sample Input
  
  
1 2 3 4 0
 

Sample Output
  
  
1.00 3.00 5.67 8.83
一看 发现曹主席A出来了全场第一题 果断去瞄瞄,啊 挺简单的 就是浮点型的数据 相加 可以硬算出来,果断暴力解决 第二个A了


就在我A矩阵的时候 有个大神A出了1000 ,我了个去 ,全场各种膜拜。我果断抛弃....心烦....继续做我的矩阵过了一会 我也A出了我的1008  好开心,应该是全场第三个A出题目的人 哈哈 

又看看1009 被长长的文字阵仗吓懵了  果断抛弃 其实 是最简单的题目 555555555555

然后 我又辗转 1002 1003 等等 发现各种当时觉得是大坑的题 完全没有头绪 ,1003我还思考了2个小时 ,感觉各种坑 ,做不出来 ,后来发现也是一道水而已 ,直到比赛结束前半个小时,发现很多人都A出了我做的那道1008  

1001 也有几个人做出来了,三个我们班的。郁闷 ,继续思考1001 找因子,循环超时 ,要用算法了 。可是一点都不会.. 技巧也不会 廖老师提醒的也不知道怎么解决 ,心烦意乱 比赛还有10分钟 ,第一名A出1007 八球 我擦 之前被题目吓到了 哎 就这样惊悚到终点结束   只做出了一道题 区区第6名 哎~




贴题!!


排序

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41139    Accepted Submission(s): 11804


Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

 

Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
 

Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
 

Sample Input
  
  
0051231232050775
 

Sample Output
  
  
0 77 12312320
 
#include<stdio.h>
#include<string.h>
#include<math.h>
//000555544445554455123
int main (void)
{
    int i,j,m,temp;
    char a[1030],b[1030];
    int c[1000];
    while(gets(b))
    {
        memset(c,0,sizeof(c));//注意第一次初始化为0
        for(i=0;;i++)
        {
            a[i]=b[i];
            if(a[i]=='\0')//如果末尾没有5 在字符串最后加上5
            {
              // printf("~~~");
                a[i]='5';
                a[i+1]='\0';
                break;
            }
        }
        //printf("strlen(a)=%d\n",strlen(a));
       // puts(a);
        for(m=i=0; i<strlen(a); i++)
        {
            if(a[i]=='5')//排除连续5的情况
            {
                continue;
            }
            else
            {
                for(;a[i]!='5';i++)//遇到a[i]=5之后,跳出循环
                {
                    c[m]=c[m]*10+a[i]-'0';//变成整数储存在数组c[m]中
                }
                m++;
                i--;
            }
        }
        for(i=0; i<m-1; i++)//排序
        {
            for(j=i+1; j<m; j++)
            {
                if(c[i]>c[j])
                {
                    temp=c[i];
                    c[i]=c[j];
                    c[j]=temp;
                }
            }
        }
        for(i=0; i<m; i++)//输出
        {
            if(i==0)
            {
                printf("%d",c[i]);
            }
            else
                printf(" %d",c[i]);
        }
        //memset(c,0,sizeof(c));
        printf("\n");
    }
    return 0;
}

吃糖果

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 27979    Accepted Submission(s): 7919


Problem Description
HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。
 

Input
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。
 

Output
对于每组数据,输出一行,包含一个"Yes"或者"No"。
 

Sample Input
   
   
2 3 4 1 1 5 5 4 3 2 1
 

Sample Output
   
   
No Yes

饭卡

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15511    Accepted Submission(s): 5361


Problem Description
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
 

Input
多组数据。对于每组数据:
第一行为正整数n,表示菜的数量。n<=1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m<=1000。

n=0表示数据结束。
 

Output
对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。
 

Sample Input
   
   
1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
 


I NEED A OFFER!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19164    Accepted Submission(s): 7674


Problem Description
Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了。要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的。Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他得到这个学校offer的可能性b。不同学校之间是否得到offer不会互相影响。“I NEED A OFFER”,他大叫一声。帮帮这个可怜的人吧,帮助他计算一下,他可以收到至少一份offer的最大概率。(如果Speakless选择了多个学校,得到任意一个学校的offer都可以)。
 

Input
输入有若干组数据,每组数据的第一行有两个正整数n,m(0<=n<=10000,0<=m<=10000) 
后面的m行,每行都有两个数据ai(整型),bi(实型)分别表示第i个学校的申请费用和可能拿到offer的概率。 
输入的最后有两个0。
 

Output
每组数据都对应一个输出,表示Speakless可能得到至少一份offer的最大概率。用百分数表示,精确到小数点后一位。
 

Sample Input
   
   
10 3 4 0.1 4 0.2 5 0.3 0 0
 

Sample Output
   
   
44.0%
Hint
You should use printf("%%") to print a '%'.
8球胜负 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4080    Accepted Submission(s): 2351


Problem Description
8球是一种台球竞赛的规则。台面上有7个红球、7个黄球以及一个黑球,当然还有一个白球。对于本题,我们使用如下的简化规则:红、黄两名选手轮流用白球击打各自颜色的球,如果将该颜色的7个球全部打进,则这名选手可以打黑球,如果打进则算他胜。如果在打进自己颜色的所有球之前就把黑球打进,则算输。如果选手不慎打进了对手的球,入球依然有效。
现在给出打进的球(白球除外)的顺序,以及黑球由哪方打进,你的任务是判定哪方是胜者。
假设不会有一杆同时打进一颗黑球和其他彩球。

 

Input
输入包含多组数据。每组数据第一行是一个整数N(1<=N<=15),表示打进的球的个数,N=0表示结束。随后有一行,包含N个字符,依序表示打进的是何种球。如果是’B’,表示是红方打进的黑球,如果是’L’,表示是黄方打进的黑球。如果是’Y’则表示是黄球,’R’表示红球。字符间没有空格。
所有输入都满足如下条件:最后一颗球打进时这局比赛正好结束,而且打进的红球和黑球都不超过7个。
 

Output
对每组数据,输出一行。如果红方胜,输出’Red’;黄方胜,输出’Yellow’。
 

Sample Input
   
   
5 RYRRB 9 RRRRYRRRB 0
 

Sample Output
   
   
Yellow Red
 



#include<stdio.h>
#include<string.h>
int main (void)
{
    char a[20];
    int i,k,b[20],pr,py;
    while(~scanf("%d",&i)&&i)
    {
        getchar();
        gets(a);
        pr=py=7;
        for(i=0; i<strlen(a); i++)
        {
            switch(a[i])
            {
            case 'Y':
            {
                py--;
                break;
            }
            case 'R':
            {
                pr--;
                break;
            }
            case 'L':
            {
                if(py!=0) printf("Red\n");
                else printf("Yellow\n");
                break;
            }
            case 'B':
            {
                if(pr!=0)
                {
                    printf("Yellow\n");
                }
                else
                {
                    printf("Red\n");
                }
                break;
            }
            }
        }


    }
    return 0;
}

最简单的计算机

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5581    Accepted Submission(s): 3095


Problem Description
一个名叫是PigHeadThree的研究组织设计了一台实验用的计算机,命名为PpMm。PpMm只能执行简单的六种命令A,B,C,D,E,F;只有二个内存M1,M2;三个寄存器R1,R2,R3。六种命令的含义如下:
  命令A:将内存M1的数据装到寄存器R1中;
  命令B:将内存M2的数据装到寄存器R2中;
  命令C:将寄存器R3的数据装到内存M1中;
  命令D:将寄存器R3的数据装到内存M2中;
  命令E:将寄存器R1中的数据和寄存器R2中的数据相加,结果放到寄存器R3中;
  命令F:将寄存器R1中的数据和寄存器R2中的数据相减,结果放到寄存器R3中。
你的任务是:设计一个程序模拟PpMm的运行。
 

Input
有若干组,每组有2行,第一行是2个整数,分别表示M1和M2中的初始内容;第二行是一串长度不超过200的由大写字母A到F组成的命令串,命令串的含义如上所述。
 

Output
对应每一组的输入,输出只有一行,二个整数,分别表示M1,M2的内容;其中M1和M2之间用逗号隔开。

其他说明:R1,R2,R3的初始值为0,所有中间结果都在-2^31和2^31之间。
 

Sample Input
  
  
100 288 ABECED 876356 321456 ABECAEDBECAF
 

Sample Output
  
  
388,388 2717080,1519268
 



#include<stdio.h>
#include<string.h>
int main (void)
{
    char a[210];
    int i;
    __int64 m1,m2,r1,r2,r3;
    while(~scanf("%I64d%I64d",&m1,&m2))
    {
       getchar();
        r1=r2=r3=0;
        gets(a);
        for(i=0;i<strlen(a);i++)
        {
            switch(a[i])
            {
                case 'A': r1=m1;break;
                case 'B': r2=m2;break;
                case 'C': m1=r3;break;
                case 'D': m2=r3;break;
                case 'E': r3=r1+r2;break;
                case 'F': r3=r1-r2;break;
            }
        }
        printf("%I64d,%I64d\n",m1,m2);
    }
    return 0;
}


遗憾收场 ~~~明天第二场开始了 fighting!!!

我要AK!!!!






最后总结一下本次的比赛:

1:看到长的题目不能心慌 ,就是吓唬人的

2:理清思路

3:仔细阅读题目,一定有各种坑点 比如 让你输入浮点型 实型 等等double 或者int 

4:HDU上面DIY的题提交代码竟然不能有//这种隐藏汉字的规定

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值