优快云每日一练20230309(幼稚班作业)

文章提供了两个编程题目,分别涉及寻找整数序列中连续权值最大的子序列以及使用四根木棍构建三角形的问题。对于最大子序列权值,关键在于处理连续负数的情况;对于三角形构建,需要判断木棍组合是否满足三角形条件或能形成伪三角形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

订班服

昨天的题目,略

题目名称:鬼画符门之宗门大比(最大子序列)

题目描述

给定整数序列A。 求在整数序列A中连续权值最大的子序列的权值。

输入描述:

第一行输入整数n.(1<=n<=1000) 第二行输入n整数a。(-1000<=a<=1000)

输出描述:

输出子序列最大权值。

示例

输入
5
-1 2 3 -2 4
输出
7

跟最长递增子序列有点相似
关键是连续负数取舍问题,
连续负数必须小于后面的数才有意义
2 3 -2 1 => 3 1 取-2 1 完全不行
1 1 -3 4 => -1 4 前面1 1 序列可以忽略,直接从4开始
前面连续整数和连续负数之和是不是正数,是的话就算上,否则重新开始统计

#include <stdio.h>
#include <stdlib.h>
int max(int a,int b) {
	return a>b?a:b;
}
void solution(int n,int arr []) {
	int s=arr[0];
	int fushu=0;
	int tmp=0;
	for (int i=0;i<n;i++) {
		if(arr[i]<0) {
			fushu+=arr[i];
			s=max(s,arr[i]);
		} else {
			if(tmp+fushu>0) {
				tmp+=fushu+arr[i];
			} else {
				tmp=arr[i];
			}
			fushu=0;
			s=max(s,tmp);
		}
	}
	printf("%d",s);
}
int main() {
	int n;
	scanf("%d", &n);
	int* arr;
	arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	solution(n, arr);
	return 0;
}

题目名称:幼稚班作业(数学)

题目描述

幼稚园终于又有新的作业了。 老师安排同学用发给同学的4根木棒拼接成一个三角形。 当然按照正常的逻辑,如果不能拼接成三角形。 必然要折断某个木棍来拼接三角形。 可是懒惰的小艺当然不会费力了! 如果拼接不成三角形小艺就会把它凭借成类似边长 1 1 2的伪三角形。 如果伪三角形都拼接不成那就不交作业!

输入描述:

输入四根木棍的长度。

输出描述:

拼接成正常三角形输出”1”,伪三角形输出”0”,否则输出”-1”。

示例

输入
1 2 3 4
输出
1

根据概念,任意两边之和大于第三边就行,
2 条小边大于第三边就行,
相等就是伪三角,否则就不行
因为有4条边
两条小的要先合并

之后再按小到大排序
比较a+b 和c的大小就行了

只要用其中三根就行,不要4根全用
排序后,比较1~3和2~4这两种情况就行了

#include <stdio.h>
#include <stdlib.h>
int cmp(const void*a,const void*b) {
	int an=*(int*)a;
	int bn=*(int*)b;
	return an>bn;
}
void solution(int* arr) {
	qsort(arr,4,sizeof(int),cmp);
	if(arr[0]+arr[1]>arr[2] || arr[1]+arr[2]>arr[3]) {
		printf("1");
	} else
	    if(arr[0]+arr[1]==arr[2] || arr[1]+arr[2]==arr[3]) {
		printf("0");
	} else {
		printf("-1");
	}
}
void solution_drop(int* arr) {
	qsort(arr,4,sizeof(int),cmp);
	arr[1]+=arr[0];
	qsort(arr+1,3,sizeof(int),cmp);
	if((arr[1]+arr[2])>arr[3]) {
		printf("1");
	} else
		if((arr[1]+arr[2])==arr[3] && (arr[1]==arr[2])) {
		printf("0");
	} else {
		printf("-1");
	}
}
int main() {
	int arr[4];
	for (int i = 0; i < 4; i++) {
		scanf("%d", &arr[i]);
	}
	solution(arr);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值