HPU2017-2016级暑期集训练习赛

      这次做题刚开始比较顺利,越到后面越差劲,主要还是心态问题,碰到不会的知识点容易上慌,希望以后注意,12道题A了8道,下次进步吧,,,,

A - 利息计算
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

为自行解决学费,chx勤工俭学收入10000元以1年定期存入银行,年利率为3.7% 。利率 
按年计算,表示100元存1年的利息为3.7元.实际上有时提前有时推迟取,因此实际利息按天 
计算,1年按365天计算,因此Q天的利息是 
本金*3.7/100 *Q/365 
存了100天后1年定期年利息提高到3.9%。如将存款提前全取出,再存1年定期。那么前面的 
100天只能按活期利息1.7%计算。 
100天的利息和本金:10000(1+1.7/100*100/365)=10046.6 
再存1年定期 :10046.6(1+3.9/100)=10438.4 
得到的利息加本金为10438.4 
如果无视利息的提高,再存1年。得到的利息加本金为(定期推迟取,利率不变) 
10000(1+3.7/100*(100+365)/365)=10471.4

Input

输入数据有多组,第1行为整数T,是数据的组数.每组占一行5个数,Y-存入的本金<=100000, 
Q-已存天数<=365,e-活期利率,f-定期利率,g-提高后的定期利率.

Output

每组数据输出2行. 
第1行,提前支取后再存1年所得本金和利息. 
第2行,继续存1年,Q+365天后所得本金和利息.

Sample Input

4
10000 100 2.3 3.7 3.9
10000 100 1.7 3.7 3.9
10000 200 1.7 3.7 3.9
10000 300 1.7 3.7 3.9

Sample Output

10455.5
10471.4
10438.4
10471.4
10486.8
10572.7
10535.2

10674.1

这道题刚开始看觉得巨麻烦,耐着性子看完后发现题目有公式,直接上代码,,

#include<stdio.h>
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int Y,Q;
		double e,f,g;
		double s1,s2,s3;
		scanf("%d%d%lf%lf%lf",&Y,&Q,&e,&f,&g);
		s1=Y*(1+e/100*Q/365);
		s2=s1*(1+g/100);
		s3=Y*( 1+f/100*( Q+365 )/365 );
		printf("%.1lf\n%.1lf\n",s2,s3);
	}
	
	return 0;
}



B - Picture
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

Give you the width and height of the rectangle,darw it.

Input

Input contains a number of test cases.For each case ,there are two numbers n and m (0 < n,m < 75)indicate the width and height of the rectangle.Iuput ends of EOF.

Output

For each case,you should draw a rectangle with the width and height giving in the input. 
after each case, you should a blank line.

Sample Input

3 2

Sample Output

+---+
|   |
|   |
+---+


好久不写的图形题,把第一行和最后一行的输出后,中间的用数组或直接输出都行。

第一次直接输出结果没过,我还以为是"|"符号错了,后来发现题目最后一句after each case, you should a blank line.

英语渣渣表示心累,,,


#include<stdio.h>
int main()
{
	int n,m;
	while( ~scanf("%d%d",&n,&m) )
	{
		char s[100][100];
		for(int i=0;i<m;i++)
		{
			s[i][0]='|';
			s[i][n+1]='|';
			for(int j=0;j<n;j++)
				s[i][j+1]=' ';
		}
		printf("+");
		for(int i=0;i<n;i++)
		printf("-");
		printf("+\n");
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n+2;j++)
			printf("%c",s[i][j]);
			printf("\n");
		}
		printf("+");
		for(int i=0;i<n;i++)
		printf("-");
		printf("+\n");
		printf("\n");
	}
	
	return 0;
}



C - ZOJ
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出。

Input

题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束。 
1<=length<=100。

Output

对于每组输入,请输出一行,表示按照要求处理后的字符串。 
具体可见样例。

Sample Input

ZZOOOJJJ
ZZZZOOOOOJJJ
ZOOOJJ
E

Sample Output

ZOJZOJOJ
ZOJZOJZOJZOO
ZOJOJO


这道题看完感觉挺简单,但就是纠结“当输入“E”时表示输入结束”,好在最后顺利写出。


#include<stdio.h>
#include<string.h>
int main()
{
	char s[150];
	while(~scanf("%s",s))
	{
		getchar();
		if(s[0]=='E')
		break;
		int l=strlen(s);
		int Z=0,O=0,J=0;
		for(int i=0;i<l;i++)
		{
			if(s[i]=='Z')
			Z++;
			if(s[i]=='O')
			O++;
			if(s[i]=='J')
			J++;
		}
		for(;Z>0||O>0||J>0;Z--,O--,J--)
		{
			if(Z>0)
			printf("Z");
			if(O>0)
			printf("O");
			if(J>0)
			printf("J");
		}
		printf("\n");
	}
	
	return 0;
}



D - 18岁生日
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

Input

一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。

Output

T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。

Sample Input

1
1988-03-07

Sample Output

6574


这道题是今天见的第一个坎,太繁琐,最不擅长分情况,最后看这道题A了挺多人,耐着性子在纸上写。

先考虑这个人没有18岁生日的情况。显然只有可能是2月29日出生的,而且出生后的第18年一定不是闰年(18不是4的倍数)。因此,2月29日出生的人没有18岁生日,输出-1。

       再考虑不是2月29日出生的情况,当年生日到第二年生日所经过的天数,不是365天,就是366天。之所以有时候会经过366天,是因为闰年的2月多出了一天。

如果此人生日是在3月份及以后,那么如果第二年是闰年,他会经过366天到第二年生日(因为经过了第二年2月29日),否则就是经过365天;如果此人生日在3月份之前,那么如果当前年是闰年,到第二年生日,就会经过366天(因为经过了当前年的2月29日),否则经过365天。

于是,再此人生日不是2月29日的前提下,先判断此人生日的月份是在3月之前,还是在3月之后,生日月份在3月前,则当前年的天数,就是到第二年生日经过的天数。生日月份在3月后,则后一年的天数,就是到第二年生日经过的天数。(转载,怪我思路不清晰)


#include<stdio.h> 
int main() 
{ 
    int T,i,nian,yue,ri; 
    scanf("%d",&T); 
    while(T--) 
    { 
        int sum=0,flag=0; 
        scanf("%d-%d-%d",&nian,&yue,&ri); 
        if( (nian%400==0||(nian%4==0&&nian%100!=0) ) )
        { 
            if(yue==2&&ri==29) 
			{printf("-1\n");continue;} 
        } 
        sum=365*18; 
        for(i=nian+1;i<nian+18;i++) 
            if(i%400==0||(i%4==0&&i%100!=0)) 
                sum+=1; 
        if(nian%400==0||(nian%4==0&&nian%100!=0)) 
        { 
            if(yue==1||(yue==2&&ri<29)) sum+=1; 
        } 
        if((nian+18)%400==0||((nian+18)%4==0&&(nian+18)%100!=0)) 
        { 
            if(yue>=3) sum+=1;  
        } 
        printf("%d\n",sum); 
    } 
    return 0; 
} 



E - 统计元音
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

统计每个元音字母在字符串中出现的次数。

Input

输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串。

Output

对于每个测试实例输出5行,格式如下: 
a:num1 
e:num2 
i:num3 
o:num4 
u:num5 
多个测试实例之间由一个空行隔开。 

请特别注意:最后一块输出后面没有空行:)

Sample Input

2
aeiou
my name is ignatius

Sample Output

a:1
e:1
i:1
o:1
u:1

a:2
e:1
i:3
o:0
u:1

这道题不难,但却被坑了一下,最开始用scanf输入不知道为啥第二组样例全是0


百思不得其解后就跳过去了,后来用gets() A过,哎~低级错误一堆,,

#include<stdio.h>
#include<string.h>
int main()
{
	int T;
	char s[100+50];
	scanf("%d",&T);
	getchar();
	while(T--)
	{
		gets(s);
		//scanf("%s",s);
		//getchar();
		int l=strlen(s);
		char c;
		int a=0,e=0,i=0,o=0,u=0;
		for(int j=0;(c=s[j])!='\0';j++)
		{
			if(s[j]=='a')
				a++;
			if(s[j]=='e')
				e++;
			if(s[j]=='i')
				i++;
			if(s[j]=='o')
				o++;
			if(s[j]=='u')
				u++;
		}
		printf("a:%d\n",a);
		printf("e:%d\n",e);
		printf("i:%d\n",i);
		printf("o:%d\n",o);
		if(T>=1)
		printf("u:%d\n\n",u);
		else
		printf("u:%d\n",u);
	}
	
	return 0;
}


F - N!Again
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

WhereIsHeroFrom:             Zty, what are you doing ? 
Zty:                                     I want to calculate N!...... 
WhereIsHeroFrom:             So easy! How big N is ? 
Zty:                                    1 <=N <=1000000000000000000000000000000000000000000000… 
WhereIsHeroFrom:             Oh! You must be crazy! Are you Fa Shao? 
Zty:                                     No. I haven's finished my saying. I just said I want to calculate N! mod 2009 


Hint : 0! = 1, N! = N*(N-1)!

Input

Each line will contain one integer N(0 <= N<=10^9). Process to end of file.

Output

For each case, output N! mod 2009

Sample Input

4 
5

Sample Output

24
120

第一感觉同余定理(老师刚讲过,,,),每次碰见大数据就心里没底,发虚的写了个后测试时发现好多数结果都是0

第一次代码:

#include<cstdio>
#define MOD 2009
int main()
{
	long long N;
	while( ~scanf("%lld",&N) )
	{
		int ans=1;
		for(int i=1;i<=N;i++)
		{
			ans=(ans%MOD*i%MOD)%MOD;
		}
		printf("%d\n",ans);
	}	
	return 0;
}


以为错了一直不敢提交,后来抱着试试看的心态提交后结果是超时,后来终于发现规律,2009=7*7*41;

所以41后面的都是0,,,心累。


#include<cstdio>
#define MOD 2009
int main()
{
	long long N;
	while( ~scanf("%lld",&N) )
	{
		int ans=1;
		if(N<49)
		{
			for(int i=1;i<=N;i++)
			{
				ans=(ans%MOD*i%MOD)%MOD;
			}
			printf("%d\n",ans);
		}
		else
		printf("0\n");
	}	
	return 0;
}



G - 进制转换
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

输入一个十进制数N,将它转换成R进制数输出。

Input

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

Output

为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

Sample Input

7 2
23 12
-4 3

Sample Output

111
1B
-11

以前做过类似的题,轻松过,代码可能有点麻烦,原谅我菜,,,,

#include<stdio.h>
int main()
{
	int N,R;
	while( ~scanf("%d%d",&N,&R) )
	{
		int a[20],c=0,flag=0;
		if(N<0)
		{
			N=-N;
			flag=1;
		}
		while(N!=0)
		{
			a[c++]=N%R;
			N=N/R;
		}
		if(flag==1)
		printf("-");
		for(c--;c>=0;c--)
		{
			if(a[c]==10)
				printf("A");
			else if(a[c]==11)
				printf("B");
			else if(a[c]==12)
				printf("C");
			else if(a[c]==13)
				printf("D");
			else if(a[c]==14)
				printf("E");
			else if(a[c]==15)
				printf("F");
			else if(a[c]==16)
				printf("G");
			else 
				printf("%d",a[c]);
		}
		printf("\n");
	}
}




H - 整数解
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。 
例如: 
x + y = 9,x * y = 15 ? 找不到这样的整数x和y 
1+4=5,1*4=4,所以,加起来等于5,乘起来等于4的二个整数为1和4 
7+(-8)=-1,7*(-8)=-56,所以,加起来等于-1,乘起来等于-56的二个整数为7和-8

Input

输入数据为成对出现的整数n,m(-10000<n,m<10000),它们分别表示整数的和与积,如果两者都为0,则输入结束。

Output

只需要对于每个n和m,输出“Yes”或者“No”,明确有还是没有这种整数就行了。

Sample Input

9 15
5 4
1 -56
0 0

Sample Output

No
Yes
Yes

比赛时没写出来,刚开始以为用解方程,结束后发现可以暴力枚举,哎~眼拙


#include<stdio.h>
int main()
{
    int i,flag;
    int n,m;
    while( ~scanf("%d%d",&n,&m),n+m )
    {
        flag=0;
        for(i=-9999;i<=9999;i++)
        {
            if(i*(n-i)==m)
            {
                flag=1;
                break;
            }
        }
        if(flag==1)
        printf("Yes\n");
        else
        printf("No\n");
    }
    return 0;
}



I - 所爱图书
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

你知道ISBN号码吗?

国际标准书号(International Standard Book Number),简称ISBN,是专门为识别图书等文献而设计的国际编号。

图书馆要采购图书,所以需要调查同学们都喜欢读哪些书。经过一番调查,图书馆收集到了许多同学们喜爱图书的信息。因此,现在需要进行数据处理。

给出调查得到同学们喜爱的图书编号,请从大到小输出这些编号。需要注意的是,每个编号只需要保留一个。

Input

第一行为一个正整数n,代表调查得到了n个编号。

面一行为n个以一个空格隔开的正整数,代表图书的编号。

0<n<100

Output

每种编号只保留一个,并从大到小输出,两个数字之间以一个空格隔开。

Sample Input

5
123 456 123 456 741

Sample Output

741 456 123

Hint

注意不要输出多余空格!


这道题做到最后没时间啦,没写完,下来给写完啦,早知道先写这道啦

排序并去重

#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int a[150],b[150];
	int T;
	scanf("%d",&T);
	for(int i=0;i<T;i++)
	scanf("%d",&a[i]);
	sort(a,a+T,cmp);
	int index=1;
	b[0]=a[0];
	for(int i=1;i<T;i++)
	{
		if(a[i]!=a[i-1])
		{
			b[index++]=a[i];
		}
	}
	for(int i=0;i<index-1;i++)
	printf("%d ",b[i]);
	printf("%d\n",b[index-1]);
	return 0;
}




J - 美素数
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

  小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。 
  问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。 
  给定一个区间,你能计算出这个区间内有多少个美素数吗?

Input

第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。 
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。

Output

对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。 
每组数据占一行,具体输出格式参见样例。

Sample Input

3
1 100
2 2
3 19

Sample Output

Case #1: 14
Case #2: 1
Case #3: 4

没想到会把刚做的题又拿出来,结果还是悲剧,第一次素数筛选时竟然变量用错,瞬间又心慌,,


#include<stdio.h>
int a[1000010]={1,1},b[1000010]={0};
int f(int a)
{
	int sum=0;
	while(a!=0)
	{
		sum+=a%10;
		a/=10;
	}
	return sum;
}
int main()
{
	for(int i=2;i<1000010;i++)
	{
		if(a[i]==1)
		continue;
		for(int j=i*2;j<1000010;j+=i)
		a[j]=1;
	}	
	for(int i=2;i<1000010;i++)
	{
		if(a[i]==0&&a[f(i)]==0)
			b[i]=b[i-1]+1;
		else
			b[i]=b[i-1];
	}	
	int T,L,R,count=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&L,&R);
		printf("Case #%d: %d\n",count++,b[R]-b[L-1]);
	}
}



还有两道题没来得及看,以后再补上,,,(我的第一篇博客)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值