CSDN第42期编程竞赛活动经验

1题目名称:鬼画符门之宗门大比(数组)

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

常见的数组题目,类似的有连续最长的长度,买卖股票也是这一类,一个会了基本就都会了。
使用2个变量,一个存最大值,一个存临时值,
临时值对数组进行累加,每次都要与最大值比较,更新最大值
如果临时值小于0就置0
示例(都是负数的情况)

数组 -3 -2 -1
初始赋值:max=-3 Tmp=-3,由于Tmp<0 ,Tmp=0
第一轮 Tmp=0±2=-2,要先跟max比较,max更新为-2,由于Tmp<0 ,Tmp=0

最终得到max=-1

#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 tmp=arr[0];
	if(tmp<0) {
		tmp=0;
	}
	for (int i=1;i<n;i++) {
		tmp+=arr[i];
		s=max(s,tmp);
		if(tmp<0) {
			tmp=0;
		}
	}
	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;
}

2题目名称:K皇把妹(数组)

存在n个节点,目标节点在m。 每个节点有自己的权值a。 在权值k内(含权值K)选择一个权值非0节点且与目标节点距 离最近。 节点i与节点j的距离为abs(i-j)。

根据要求遍历数组即可,不满足的跳过就行,最后得到最小值。
当然可以从目标节点向两边遍历,但就比较费脑子了

#include <stdio.h> 
#include <stdlib.h> 
int min(int a,int b) {
	return a<b?a:b;
}
void solution(int n, int m, int k,int arr []) {
	int s=n;
	m--;
	for (int i=0;i<n;i++) {
		if(arr[i]>k||arr[i]==0||i==m) {
			continue;
		}
		if(i<m) {
			s=min(s,m-i);
		} else {
			s=min(s,i-m);
		}
	}
	printf("%d",s);
}
int main() {
	int tem_arr[3];
	for (int i = 0; i < 3; i++) {
		scanf("%d", &tem_arr[i]);
	}
	int n = tem_arr[0];
	int m = tem_arr[1];
	int k = tem_arr[2];
	int* arr;
	arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	solution(n, m, k, arr);
	return 0;
}

3题目名称:影分身(消消乐)

已知字符串str。字符串str包含字符’x’,’y’。 如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。 xyyx - > yx ->
xyyyy->yyy

题目共给出2个案例
如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。
这句话超令人费解。凭感觉最后要么都是x要么都是y。
如果再给个示例xxxyyy->xxyy->xy-> 相信大家都会做了。最后剩下的是多的那个。
数组要足够大,否则没法100%过

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
void solution(char* str,int checkpos) {
	char str2[2000000]= {0};
	int len=strlen(str);
	int xn=0;
	int yn=0;
	for (int i=0;i<len;i++) {
		if(str[i]=='x') {
			xn++;
		} else {
			yn++;
		}
	}
	if(xn>yn) {
		int s=xn-yn;
		for (int i=0;i<s;i++) {
			str2[i]='x';
		}
	} else if(yn>xn) {
		int s=yn-xn;
		for (int i=0;i<s;i++) {
			str2[i]='y';
		}
	}
	printf("%s",str2);
}
int main() {
	char str[2000000]= {0};
	scanf("%s", str);
	solution(str,0);
	return 0;
}

4题目名称:开心的金明(动态规划)

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天 对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。今天一早金明就开始做预算,但 是他想买的东西太多了,肯定会超过妈妈限定的 N 元。于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1-5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第 j 件物品的价格为 ##v_[j] ##,重要度为 ##w_[j] ##,共选中了 k 件物品,编号依次为 ##j_1,j_2,…,j_k## ,则所求的总和为: ##v_[j_1] imes w_[j_1]+v_[j_2] imes w_[j_2]+ …+v_[j_k] imes w_[j_k] ##。 请你帮助金明设计一个满足要求的购物单。

动态规划的经典题目,背包算法,可以到B站搜视频学习一下,都是一个解题思路,会画表格就行。如果物品有数量限制,那难度就上升一个级别了。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int max(int a,int b) {
	return a>b?a:b;
}
void solution(int N, int m, int (*p)[2]) {
	int* tmpa=(int*)malloc(sizeof(int)*(N+1));
	int* tmpb=(int*)malloc(sizeof(int)*(N+1));
	memset(tmpa,0,sizeof(int)*(N+1));
	memset(tmpb,0,sizeof(int)*(N+1));
	for (int i=0;i<=N;i++) {
		if(i<p[0][0]) {
			tmpa[i]=0;
		} else {
			tmpa[i]=p[0][0]*p[0][1];
		}
	}
	memcpy(tmpb,tmpa,sizeof(int)*(N+1));
	for (int pos=1;pos<m;pos++) {
		for (int i=0;i<=N;i++) {
			if(i<p[pos][0]) {
				tmpa[i]=tmpb[i];
			} else {
				int left=i-p[pos][0];
				tmpa[i]=max(tmpb[i],tmpb[left]+p[pos][0]*p[pos][1]);
			}
		}
		memcpy(tmpb,tmpa,sizeof(int)*(N+1));
	}
	printf("%d",tmpb[N]);
}
int main() {
	int temp_arr[2];
	for (int i = 0; i < 2; i++) {
		scanf("%d", &temp_arr[i]);
	}
	int N = temp_arr[0];
	int m = temp_arr[1];
	int (*p)[2];
	p = (int(*)[2])malloc(m * sizeof(int*));
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < 2; j++) {
			scanf("%d", &p[i][j]);
		}
	}
	solution(N, m, p);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值