给定整数序列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
#include
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;
}
存在n个节点,目标节点在m。 每个节点有自己的权值a。 在权值k内(含权值K)选择一个权值非0节点且与目标节点距 离最近。 节点i与节点j的距离为abs(i-j)。
根据要求遍历数组即可,不满足的跳过就行,最后得到最小值。
当然可以从目标节点向两边遍历,但就比较费脑子了
#include
#include
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;
}
已知字符串str。字符串str包含字符’x’,’y’。 如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。 xyyx - > yx ->
xyyyy->yyy
题目共给出2个案例
如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。
这句话超令人费解。凭感觉最后要么都是x要么都是y。
如果再给个示例xxxyyy->xxyy->xy-> 相信大家都会做了。最后剩下的是多的那个。
数组要足够大,否则没法100%过
#include
#include
#include
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;
}
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天 对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 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
#include
#include
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;
}