HAUE第二次周赛题解

《难题》

alt

这个题跟题目没有任何关系 而且恰恰相反

直接输出n个1就行

c

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int x;
		scanf("%d",&x);
		for(int i=1;i<=x;i++) printf("1 ");
		printf("\n");
	}
}

串串香之cyl带你吃

alt

这个题可以从样例中得到结论 即为 k*s+

那么就可以愉快的写代码了

c

#include<stdio.h>
int a[1000001];
int main()
{
	int n,k,s;
	scanf("%d%d%d",&n,&k,&s);
	int ans=k*s;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		ans=ans+x*a[i];
	}
	printf("%d",ans);
 } 

孤注一掷之代码一掷

alt

此题就是将1进制改为二进制

zzulioj,haueojhaue软件学院oj里面都有类似的题目

话不多说上代码

#include<stdio.h>
int a[100];
int main()
{
	long long n;
	scanf("%lld",&n);
	int s=0;
	for(int i=0;i<=63;i++)
	{
		if(n>>i&1) a[i]=1,s=i;
	}
	for(int j=s;j>=0;j--) printf("%d",a[j]);
 } 

这个代码用了位运算 如果还没了解到的可以看代码二

#include<stdio.h>

void convert(int n,char str[]);
int main(){
	char str[666];
	int n;
		scanf("%d",&n);
	if(n==1||n==0)
		printf("%d\n",n);
	else
		convert(n,str);
	return 0;
}

void convert(int n,char str[])
{
	int i=0;
	while(n>0)
	{
		str[i++]=n%2+'0';
		n/=2;
	}
	while(i--)
		printf("%c",str[i]);
}

快乐早八

alt

这个题目直接按照题目要求即可 当在7点多的时候一定不会迟到

9点多的时候一定会旷课

那么我们只用考虑8点多的时候:

	1.8:00的时候一定不会迟到

	2.8:01到8:05的时候一定是迟到

	3.8点的其他时间一定是旷课的

那么我们就可以按照题目意思进行写代码

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	int a1=0,a2=0;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		scanf("%d:%d",&x,&y); 
		if(x==9)
		{
			a2++;
		} 
		else if(x==8)
		{
		 	if(y<=5&&y>0) a1++;
		 	else if(y>5&&y<=59) a2++;
		}
	}
	printf("%d %d",a1,a2);
} 

大学课程总分

alt

这个题目是小模拟 我们只需要按照要求进行计算即可

输入n行a,x,b,y,然后把每行的ab+xy加起来就行

建议用double进行读入

下面看代码

#include<stdio.h>
int main()
{
	double a,b,x,y,sum=0;
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lf%lf%lf%lf",&a,&x,&b,&y);
		sum=sum+a*b+x*y;
	}
	sum=sum;
	printf("%.1lf",sum);
}

无限取模

alt

题目非常的干净

那么我们可以试试找规律

因为这个数就一个 而且数据很大,这个很容易找规律

数据 答案
 2  0
 3  1
 4  1
 5  2
 6  2
 7  3
 8  3

我们可以发现答案就是(n-1)/2

那么我们可以很快的写代码了

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d",(n-1)/2);
 } 

HAUE上学之旅

alt

这个题目我们可以发现 5以内都是1步,当大于5的时候,一直走五步是最快的,如果有余数直接次数+1即可。

即上取整(n+4)/5

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	
	printf("%d",(n+4)/5);
}

暑假练车之科目二

alt

这个题目就是模拟题目,算是一个小模拟,按照题目要求即可。

这个题目对于大家来说 就是怎么储存字符串,以及怎么查找字符串,这是个问题。我们可以先读入 m个字符串使用字符串数组a[1000][1000]进行储存。

先写一个函数,这个函数的作用看字符串x在数组a里面对应的下标位置。

函数写完了 那么读入n个字符串之后,每读入一个字符串,使用函数找到对应的下标,然后定义一个int类型数组b,b[x对应的下标]++。

最后判断在这b[1]~b[m]里面有多少大于等于k记录下来即可。

代码如下

#include<stdio.h>
#include<string.h>
char a[100][100];
char q[100];
int c[100];
int n,m,k;
void add(char x[])
{
	for(int i=1;i<=m;i++)
	{
		if(strcmp(x,a[i])==0)
		{
			c[i]++;
		}
	}
}
int main()
{
	scanf("%d%d%d",&m,&n,&k);
	for(int i=1;i<=m;i++)
	{
		scanf("%s",a[i]);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%s",q);
		add(q);
	}
	int ok=0;
	for(int i=1;i<=m;i++)
	{
		if(c[i]>=k) ok++;
	}
	if(ok==m) printf("yibaguo");
	else if(ok==0) printf("-1");
	else printf("%d",ok); 
}

《真》《签到》

alt

这个题目是真的真的真的与题目难度相反

这个题意思就是找到每个点的8个正方向有多少个点。

那么我们可以使用暴力的写法:

两重for循环一下,每次对应两个点进行判断,但是不能保证两个点一样

代码如下

#include<stdio.h>
#include<math.h>
int a[5050],b[5050];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		a[i]=x,b[i]=y; 
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(j==i) continue;
			if(a[i]==a[j]||b[i]==b[j]||abs(a[i]-a[j])==abs(b[i]-b[j])) ans++;
			//a[i]==a[j] 表示在同一竖行
			//b[i]==b[j] 表示在同一横行
			// abs(a[i]-a[j])==abs(b[i]-b[j]) 表示 i和j斜率一样 
		}
	}
	printf("%d",ans);
} 

第二种是思维想法 我们可以储存横行里面每个点的坐标,(x+y)和(x-y)的点的多少,于是可以发现每一个排列组合,即x*(x-1)/2

那么代码如下

#include<stdio.h>
int a[5050],b[5050],c[5050],d[5050];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		a[x]++;
		b[y]++;
		c[2000+x-y]++;
		d[2000+x+y]++;
	}
	int ans=0;
	for(int i=0;i<=5050;i++)
	{
		if(a[i]>1) ans+=a[i]*(a[i]-1);
		if(b[i]>1) ans+=b[i]*(b[i]-1);
		if(c[i]>1) ans+=c[i]*(c[i]-1);
		if(d[i]>1) ans+=d[i]*(d[i]-1);
	}
	printf("%d",ans);
} 
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务