订班服
昨天的题目,略
题目名称:鬼画符门之宗门大比(最大子序列)
题目描述
给定整数序列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;
}