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;
}