题意:
给你t组数据,每组数据包含一个数组a有n个数和k,下一行是对应是n个数。
最多进行k次操作,可将两个下标对应的数取余k后的结果相同的进行交换位置。
操作完成后需选择k个连续的数进行相加,
问最后你所能得到的最大的数。
思路:
交换的操作实际上是可以任意交换相差n*k的数(n为正整数)。
因为最多操作次数为k,可以将前k个值都换成其可换中最大的数。
因为所给数据小直接暴力。
代码:
时间复杂度 o(n^2)
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[200];
int n, k;
int t; cin >> t;
while(t--) {
long long int ans = 0;
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= k; i++) {
int max = -1e9;
for(int j = i; j <= n; j += k) {
if(a[j] > max) max = a[j];
}
a[i] = max;
ans += a[i];
}
cout << ans <<'\n';
}
return 0;
}
总结:一定要保证头脑清晰,观察它的规律。