BNUZ寒假训练2.5

52 篇文章 1 订阅
34 篇文章 0 订阅

BNUZ寒假训练2.5
A题:A - Infinity Gauntlet
代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char a[6][15]={"purple","green","blue","orange","red","yellow"}; 
	char b[6][15]={"Power","Time","Space","Soul","Reality","Mind"};
	char c[10][15];
	int i,j,n,m=0,v[10]={0};
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%s",c[i]);
		for(j=0;j<6;j++)
		{
			if(strcmp(c[i],a[j])==0)
			{
				v[j]++;
				m++;
			}
		}
	}
	printf("%d\n",6-n);
	for(i=0;i<6;i++)
		if(v[i]==0)
			printf("%s\n",b[i]);
	return 0;
}

B题:
解题思路:
用数学的方法,比如说当x=5时,y=8时,等式为:x^y 和 y^x(5 ^8和8 ^5),这时可对两边求对数,即为ylnx和xlny(即8ln5和5ln8),比较两边就完事了.
代码如下:

#include<stdio.h>
#include<math.h>
#define ll long long
using namespace std;
int main()
{
    ll x,y;
    scanf("%lld%lld",&x,&y);
    if((double)y*log(x)>(double)x*log(y))
    printf(">");
    else if((double)y*log(x)<(double)x*log(y))
    printf("<");
    else printf("=");
    printf("\n");
    return 0;
}

C题:
经典贪心算法,即找到最划算的商店然后一直买就是了,代码如下:

#include <stdio.h>
int main()
{
	int a,b,n,m,i;
	double c,max=0;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		c=1.0*b/a;
		if(c>max)max=c;
	}
	printf("%.8lf",1.0*m/max);
	return 0;
}

D题:
就是找位数和为10的数字嘛,如果找到了就让计算器+1,直到计数器为我们输入的那个k为止。代码如下:

#include <stdio.h>
int f(int n);
int main()
{
	int k,pos=0;
	scanf("%d",&k);
	for(int i=19;pos!=k;i++)
	{
		if(f(i)==1)
		pos++;
		if(pos==k)
		{printf("%d\n",i);break;}	
	}
	return 0;
}
int f(int n)
{
	int sum=0,i;
	while(n>0)
	{
		sum+=n%10;
		n/=10;
	}
	if(sum==10)return 1;
	else return 0;
}

E题:
一开始理解错题意了,还以为连续的一段是指不被隔开就算连续,搞了快一个小时的BFS不知道为什么就是过不了,最后发现没那么复杂。。。。如果用BFS就会导致重复计算到相同的路径。
解题方法:分别找行和列的连续段,比如说我们要连续让三个人进位,连续的位置有5个,即. . . . .这时候就有多少种选择呢,没错就是5-3+1种选择,三个人可以坐前面三个位置即 。。。. .也可以后移一位坐,即. 。。。.也可以再后移一位也就是. . 。。。是不是很生动形象,哈哈哈哈哈哈哈哈哈或或或或或或哈哈哈哈哈哈哈哈哈
,所以总结下规律就是有x个连续的点,就有x-k+1个选择方案!!
核心代码(以下代码纯属瞎打,可能有错我也没上交过,但是思路应该是没错的(doge)):

#include <stdio.h>
#include <string.h>
char a[2021][2021];
int main()
{
	int i,j,n,m,k,sum,l;
	while(~scanf("%d%d%d",&n,&m,&k))
	{
	sum=0;l=0;
	for(i=0;i<n;i++)
	{
		scanf("%s",a[i]);
	}
	for(i=0;i<n;i++)
	{
		sum=0;
		//找横的连续的座位 
		for(j=0;j<m;j++)
		{
			if(a[i][j]=='.')
			{
				sum++;
			}
			else
			{
				if(sum>=k){
					l+=(sum-k+1);
 				}
 				sum=0;
			}
		}
		if(sum>=k)
		{
			l+=sum-k+1; 
		}
	}
	for(i=0;i<m;i++)
	{
		sum=0;
		//找竖的连续的座位
		for(j=0;j<n;j++)
		{
			if(a[i][j]=='.')
			{
				sum++;
			}	
			else
			{
				if(sum>=k){
					l+=(sum-k+1);
 				}
 				sum=0;
			}
		}
		if(sum>=k)
		{
			l+=(sum-k+1); 
		}	
	} 
	//排除k为1,即横着数和竖着数都一样的情况
	//这种情况下会重复计数 
	if(k==1)printf("%d",l/2);
	else printf("%d",l);	
	memset(a,0,sizeof(a));	 		
	}
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值