本蒟蒻技术很菜,某日遇贪心一题,提交代码,获得TLE之果,求找BUG
给定一个长度为n的序列S1,给定一个长度为m的序列S2。一次交换可以把S2中的一个数字和S1中的一个数字交换。问最多做k次交换后,序列S1元素和的最大值。
第1行为三个整数n,m,k(均不超过100000)。
接下来一行为n个整数(绝对值不超过100),表示序列S1。
接下来一行为m个整数(绝对值不超过100),表示序列S2。
一行,一个整数。
#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;
}