省赛训练之基础(二)

今天是训练的第二天,今天做的是北大平台上的:

1、POJ-->2136:

     思路:

            把出现字母的频率计算出来,打出空格即可

    方法:

     

#include<stdio.h>
#include<string.h>
int main(){
	char a[100];
	int T=4,i,j,k,len,b[100],white,max;
		memset(b,0,sizeof(b));
		max = 0;
	while(T--){
		gets(a);
		len = strlen(a);
		for(i=0;i<len;i++){
			b[a[i]-'A']++;
		}
	}//计算字母出现的次数,下面是找到最大的出现次数max
//	printf("%d\n",max);
	for(i=0;i<26;i++){
		if(b[i]>max)
		  max = b[i];
	}
//	printf("%d\n",max);
	for(i=0;i<max;i++){
		for(j=0;j<26;j++){
			white = max - b[j];
			if(white<=i)
				printf("* ");
			else printf("  ");
		}
		printf("\n");
	}
	for(i=0;i<26;i++)
		printf("%c ",i+'A');
	printf("\n");
}

2、Poj-->2017:Speed Limit

      思路:相信这题大家只要读懂了题目就会了吧~

 

Speed in miles perhourTotal elapsed time in hours
202
306
107

 

其实它的意思就是“Total elapsed time in hours”的前一个减去后一个再乘上“Speed in miles perhour”

   方法:

#include<stdio.h>
int main(){
	int T,s[20],t[20],i,j,k,sum;
	while(scanf("%d",&T)!=EOF){
		i=0;
		if(T==-1)
			break;
	while(T--){
		sum=0;
		scanf("%d%d",&s[i],&t[i]);
//		printf("%d%d\n",s[i],t[i]);
		i++;
	}
//	printf("%d %d\n",s[0],t[0]);
	sum = s[0]*t[0];
//	printf("%d\n",sum);
	for(j=1;j<i;j++)
	{
	sum = sum+s[j]*(t[j]-t[j-1]);
	}
	printf("%d miles\n",sum);
	}
}


3、POJ-->1207
      思路:对所有的数字求出cycle number

      方法:

    

#include<stdio.h>
int fun(int a){
int i,j,k,r;
r = 1;
while(a!=1){
		if(a%2==0)
			a = a/2;
		else
			a = a*3+1;
		r++;
	}
return r;
}
int main()
{
	int i,j,k,a,b,temp,p,q;
	while(scanf("%d%d",&a,&b)!=EOF){
		k=0;
		p = a;
		q = b;
		if(a>b){
			temp = a;
			a = b;
			b = temp;
		}
		for(i=a;i<=b;i++){
			temp=fun(i);
			if(temp>k){
				k=temp;
			}
		}
		printf("%d %d %d\n",p,q,k);
	}
}


 

4、POJ-->1316

    思路:这题运用的是“筛选法”,从d(1)开始运算,将求出来的那个数字标志为1,最后输出从1--1000中的标志不为1的数字。

    方法:

        

#include<stdio.h>
#include<string.h>
int main()
{
	int flag[10005],i,k,sum,m;
	memset(flag,0,sizeof(flag));
	for(i=1;i<10000;i++){
		m=i;
		sum=m;
		while(m>0){
			sum=sum+m%10;
			m = m/10;
		}
		if(sum<10000)
			flag[sum] = 1;
	}
	for(i=1;i<10000;i++){
		if(flag[i]!=1)
			printf("%d\n",i);
	}
}

5、POJ-->1979

      思路:这题是告诉我们'.' - 表示黑砖    '#' - 表示红砖  '@'- 表示那个人所在的位置,这题用到了递归、

      方法:对四个方向进行搜索,将可以经过的位置标记起来。

#include<stdio.h>
#include<string.h>
char a[25][25];
int w,h;
int search(int p,int q){
	int i,j,k;
	if(p==-1||q==-1||p==h||q==w)
		return 0;//已经算到尾巴了
	else if(a[p][q]=='#'||a[p][q]==1){
		return 0;
	}
	else{
		a[p][q]=1;
		search(p-1,q);
		search(p,q-1);
		search(p,q+1);
		search(p+1,q);
	}
}
int main(){
	int i,j,k,p,q;
	while(scanf("%d%d",&w,&h)!=EOF){
		if(w==0&&h==0)
			break;
		getchar();
		k=0;
		for(i=0;i<h;i++){
			for(j=0;j<w;j++){
				scanf("%c",&a[i][j]);
				if(a[i][j]=='@'){
					a[i][j]='.';
					p = i;
					q = j;
				}
			}
			getchar();
		}
		search(p,q);
		for(i=0;i<h;i++){
			for(j=0;j<w;j++){
				if(a[i][j]==1)
					k++;
			}
		}
		printf("%d\n",k);
	}
}


这些就是我今天学的,明天要努力啦,哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值