基础算法题解(hrbeu OJ)

计数问题

TimeLimit: 1 Second   MemoryLimit: 32 Megabyte

Totalsubmit: 2766   Accepted: 299  

Description

给你两个数a和b,你的任务是计算出1在a和b之间出现的次数,比如说,如果a=1024,b=1032,那么a和b之间的数就是:

1024 1025 1026 1027 1028 1029 1030 1031 1032

则有10个1出现在这些数中。

Input

输入不会超过500行。每一行有两个数a和b,a和b的范围是0 < a, b < 100000000。输入两个0时程序结束,两个0不作为输入样例。

Output

对于每一对输入的a和b,输出一个数,代表1出现的个数。

Sample Input


1 10
44 497
346 542
1199 1748
1496 1403
1004 503
1714 190
1317 854
1976 494
1001 1960
0 0

Sample Output

2
185
40
666
113
105
1133
512
1375
1256


分治:

#include
int m[12]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int geshu(int t){
	if(t==-1)return 0;
	int i=0,res=0;
	while(1){
		if(m[i]>t)break;
		if((t/m[i])%10>1){
			res+=((int)t/m[i+1]+1)*m[i];
		}
		else if((t/m[i])%10==1){
			res+=((int)t/m[i+1])*m[i]+t%m[i]+1;
		}
		else{
			res+=(int)t/m[i+1]*m[i];
		}
		++i;
	}
	return res;
}

int main(){
	int a,b;
	while(scanf("%d%d",&a,&b)!=EOF){
		if(a==0&&b==0)break;
		if(a>b){a^=b^=a^=b;}
		printf("%d\n",geshu(b)-geshu(a-1));
	}return 0;
}

汉诺塔问题

TimeLimit: 1 Second   MemoryLimit: 32 Megabyte

Totalsubmit: 800   Accepted: 392  

Description

汉诺塔(又称河内塔)问题其实是印度的一个古老的传说。

开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上 面。计算结果非常恐怖(移动圆片的次数)18446744073709551615,众僧们即便是耗尽毕生精力也不可能完成金片的移动了。

Input

输入一个正整数n,表示有n个盘片在第一根柱子上。

Output

输出操作序列,格式为move t from x to y。每个操作一行,表示把x柱子上的编号为t的盘片挪到柱子y上。柱子编号为a,b,c,你要用最少的操作把所有的盘子从a柱子上转移到c柱子上。

Sample Input

3

Sample Output

move 1 from a to c
move 2 from a to b
move 1 from c to b
move 3 from a to c
move 1 from b to a
move 2 from b to c
move 1 from a to c


递归:

#include 
#include 
int n;
void han(int x,char a,char b,char c) 
{
    if (x!=1) han(x-1,a,c,b); 
    printf("move %d from %c to %c\n",x,a,c);
    if (x!=1) han(x-1,b,a,c);
}
int main()
{
    while(scanf("%d",&n)==1){
         han(n,'a','b','c');
     }
    return 0;
}

木棒三角形

TimeLimit: 1 Second   MemoryLimit: 32 Megabyte

Totalsubmit: 1497   Accepted: 314  

Description

小A家里有很多长度不一样的木棍,有一天他很无聊,只能摆弄这些木棒来解闷了。小A的数学学得很好,所以他想在这些木棒中挑出3根来组成一个直角三角形,当然,他有可能有很多种选法,所以他还想挑出一个面积最大的。

Input

输入有多组,每组输入包括2行,第一行输入一个n(0<=n<=100),表示小A有n根木棍,接着一行有n个整数(<=1000),表示木棍的长度(长度从小到大给出)。

Output

输出面积最大的直角三角形的面积,且保留3位小数,如果不能组成,输出“My Good!”

Sample Input

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

Sample Output

My Good!
6.000
24.000
My Good!


模拟:
#include
int s[1010];
int main(){
    int t,i,j,k,flag;
    double sum;
    while(scanf("%d",&t)==1){
        sum=0;
        for(i=0;isum){
                            flag=1;
                            sum=(double)(s[i]*s[j])/2.0;
                        }
        if(flag)
            printf("%.3lf\n",sum);
        else
            printf("My Good!\n");
    }
    return 0;
}


A公司的烦恼

TimeLimit: 1 Second   MemoryLimit: 32 Megabyte

Totalsubmit: 195   Accepted: 85  

Description

A公司的电脑管理系统受到了千年虫病毒的攻击,A公司因此丢失了向MS公司做年终汇报的数据。

A公司目前掌握的数据是MS公司每次公布的公司盈亏报表,而MS公司公布盈亏的方式与众不同,它每次都是将连续5个月的盈或亏得总和做一次性的公布,因此A公司不知道每个月具体的盈亏状况。已知的情况是所有盈利月盈利固定为s,而亏损月亏损固定为d。

写一个程序,确定MS公司是否盈利,若盈利的话,那么可能的盈利最大值是多少。

Input

输入为两个正整数s和d。

Output

对于每一组的输入数据,若盈利的话,那么输出可能的盈利最大值是多少;若亏损的话,输出Deficit。

Sample Input

59 237
375 743
200000 849694
2500000 8000000

Sample Output

116
28
300612
Deficit

贪心:

#include
int main()
{
    int s,d;
    while(scanf("%d%d",&s,&d)==2)
    {
         int i,sum;
         for(i=0; i<5; i++)
                if( s*(5-i) - d*i < 0)
                         break;
         if(i==4)
            sum = 3*s - 9*d;
         else
            sum = s*(12-2*i) - d*2*i;
         if( i==5 || sum<0 )
            printf("Deficit\n");
         else
            printf("%d\n",sum);

    }
    return 0;
}


你可能感兴趣的:(2014寒假,基础算法)