大一第十周学习总结

目录

题目一:数数子

题目二:蚂蚁问题

题目三:求区间和

题目四:高中分段函数


题目一:数数子

4997063767544c54ac3027f5321559a5.jpg

输入:

1
2
6

输出:

0
1
5

思路:直接代入2,3,5因子进行求解。(简化计算量)

#include<stdio.h>
int main()
{
    int n,t,k;
    int x,y,z,a,b,c;
    while(scanf("%d",&n)!=EOF)
    {
        x=n/2;//由于定义的是整型,所以小数点后面的会省去
        y=n/3;
        z=n/5;
        a=n/(2*3);
        b=n/(3*5);
        c=n/(2*5);
        k=n/(2*3*5);
        t=x+y+z+k-a-b-c;//这种算法可以简化计算量,防止输出时间超限
        printf("%d\n",t);
    }
    return 0;
}
//#include<stdio.h>//如果采用以下方法,则容易造成输出超限
//int main(){
//	int n,m,j,i,k;
//	while(scanf("%d",&n)!=EOF){
//		int x=0;
//		for(int i=1;i<=n;i++)
//		if(i%2==0||i%3==0||i%5==0)
//		x++;
//		printf("%d\n",x);
//	}
//	return 0;
//}
题目二:蚂蚁问题

949dee30820f47999d7874adc74222cf.jpg

输入:

15
5
2 6 7 10 12

输出:

7 13

思路:看距哪边要走的距离长短来写,输出的一个是短里选长,一个是长里选长(落下杆子的路程)

#include<stdio.h>
int main() {
	int n,l,i,j,t,k,o;
	int a[1001],b[1001],c[1001];
	scanf("%d",&l);//长度
	scanf("%d",&n);//数量
	for(i=1; i<=n; i++)
		scanf("%d",&a[i]);
			for(i=1; i<=n; i++) {
		c[i]=l-a[i];//求出距离右边多远
	}
		for(i=1; i<=n; i++) {
		if(a[i]>c[i])
			c[i]=a[i];//用C数组存储距离左右的最大值
	}
//		for(i=1; i<=n; i++)//验证前面是否错误
//		printf("%d ",a[i]);
	for(j=1; j<n; j++)
		for(i=1; i<=n-j; i++)
			if (c[i]<c[i+1]) {
				t=c[i];
				c[i]=c[i+1];
				c[i+1]=t;
			}//大小排序,大到小
			
			
			
	for(i=1; i<=n; i++) {
		b[i]=l-a[i];
	}
	for(i=1; i<=n; i++) {
		if(a[i]<b[i])
			b[i]=a[i];//用B数组存储距离左右的最小值,之所以取数组B的最大值作为最短距离,是因为如不这样选,会有蚂蚁无法落下杆子
	}
	for(j=1; j<n; j++)
		for(i=1; i<=n-j; i++)
			if (b[i]<b[i+1]) {
				o=b[i];
				b[i]=b[i+1];
				b[i+1]=o;
			}                   //排序,大到小
	printf("%d %d",b[1],c[1]);//输出最短和最长
	return 0;
}
题目三:求区间和

bf3ac4645d694b2b9b6172b542156cea.jpg

输入:

4
4 3 2 1
2 
1 4
2 3

输出:

10
5

思路;前缀和与差分

链接:关于前缀和与差分.

前缀与差分

#include <stdio.h>
int main(){
    int a[1001],b[1001],sum[1001];
int i,j,t,n,m;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
sum[i]=a[i]+sum[i-1];//数组sum代表数组前面i项的和(好处;减少计算量,减少运行时间,防止出现输出超限的问题)
scanf("%d",&m);
while(m--){
    int k,t,l,o;
    scanf("%d %d",&k,&t);
l=sum[t]-sum[k-1];//可以很轻松地求数组t到k的和,并且计算难度底
printf("%d\n",l);
}
return 0;
}
题目四:高中分段函数

86df4d26777741eabb90daaf695ddcc1.jpg

输入:

4
1
2
3
50

输出:

1
2
6
152170130090

思路:定义数组,减少计算量,防止输出超限

	#include<stdio.h>
int main() {
	int n,i=3;
	long long a[51];
	a[1]=1;
	a[2]=2;
	do {
		a[i]=a[i-1]+a[i-2]+i*(i-1)/2;//提前制定好数组a的含义,方便后面输出
		i++;
	} while(i<=50);
	scanf("%d",&n);
	while(n--) {
		long long m;
		scanf("%lld",&m);
		printf("%lld",a[m]);
		printf("\n");
	}
	return 0;
}

8ba6d6a4ed6a441d975680e6d9e8b5bf.png

a80c30262e87417486acfddea6f3c250.png

             本周写题26道,排名基本无变化

                  第九周学习总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值