计数问题
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;
}