求助一道题
  • 板块灌水区
  • 楼主10chen01
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/7/18 14:21
  • 上次更新2023/10/27 19:44:15
查看原帖
求助一道题
753280
10chen01楼主2022/7/18 14:21

WHY

本蒟蒻技术很菜,某日遇贪心一题,提交代码,获得TLE之果,求找BUG

题目描述:

给定一个长度为n的序列S1,给定一个长度为m的序列S2。一次交换可以把S2中的一个数字和S1中的一个数字交换。问最多做k次交换后,序列S1元素和的最大值。

输入格式:

第1行为三个整数n,m,k(均不超过100000)。

接下来一行为n个整数(绝对值不超过100),表示序列S1。

接下来一行为m个整数(绝对值不超过100),表示序列S2。

输出格式:

一行,一个整数。

我的代码(C++)

#include<bits/stdc++.h>

using namespace std;

int MAXN=-(0x3f3f3f3f);

int n, m, k;
int s1[100005], s2[100005];

// int getMinElem(int *a, int len){
// 	int minn=0x3f3f3f3f;
// 	for(int i=1;i<=len;i++){
// 		minn = min(a[i], minn);
// 	}
// 	return minn;
// }

int getMinElemByIdx(int *a, int len){
	int minn=1;
	for(int i=2;i<=len;i++){
		minn = a[i]>a[minn]?minn:i;
	}
	return minn;
}

// int getMaxElem(int *a, int len){
// 	int maxn=-(0x3f3f3f3f);
// 	for(int i=1;i<=len;i++){
// 		maxn = max(a[i],maxn);
// 	}
// 	return maxn;
// }

int getMaxElemByIdx(int *a, int len){
	int maxn=1;
	for(int i=2;i<=len;i++){
		maxn = a[i]>a[maxn]?i:maxn;
	}
	return maxn;
}

int getSum(int *a, int len){
	int sum=0;
	for(int i=1;i<=len;i++){
		sum += a[i];
	}
	return sum;
}

int myMax(int a, int b){
	return a>b?a:b;
}

int main(){
	scanf("%d%d%d", &n, &m, &k);
	for(int i=1;i<=n;i++){
		scanf("%d", &s1[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d", &s2[i]);
	}
	MAXN = myMax(MAXN, getSum(s1, n));
	for(int i=1, j=1;i<=k&&j<=n;j++){
		int min_index = getMinElemByIdx(s1, n);
		int max_index = getMaxElemByIdx(s2, m);
		if(s1[min_index]<s2[max_index]){
			int temp = s1[min_index];
			s1[min_index] = s2[max_index];
			s2[max_index] = s1[min_index];
			MAXN = myMax(MAXN, getSum(s1, n));
			i++;
		}
	}
	printf("%d", MAXN);
	return 0;
}
2022/7/18 14:21
加载中...