最终收敛值
时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
假设a[n]是一个有n个元素的整型数组,定义该数组上的一个操作f(a[n],r),f把a[n]按步长r映射到另外一个数组b[n],映射规则如下:b[i]=MED(a[i],a[(i+1)mod n],a[(i+2)mod n],...a[(i+r-1)mod n])。MED指中位数,即获得r个元素中从小到大排在中间的元素(如果r是偶数,取中间两个元素较大的那个)。mod n是指模n的加法,相当于a[n]是一个循环数组。
现输入一个数组a[n],和步长初始值r(1<=r<=n),用f对数组a[n]进行反复的迭代映射(映射结果写回a[n]),每迭代一轮步长r增加1,直到最后一轮r=n之后迭代结束。此时数组a[n]中每一个元素必然完全相同,请把这个元素输出。
提示:
除了对性能和正确性的要求,我们还将重点考察代码书写风格。
输入
第一行是数组的长度n,第二行是r的初始值,之后n行每行是一个整数,对应a[n]中一个元素。
输出
最终收敛值。
样例输入
7
5
1
2
3
4
5
6
7
样例输出
AC了20%。。。。
时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
假设a[n]是一个有n个元素的整型数组,定义该数组上的一个操作f(a[n],r),f把a[n]按步长r映射到另外一个数组b[n],映射规则如下:b[i]=MED(a[i],a[(i+1)mod n],a[(i+2)mod n],...a[(i+r-1)mod n])。MED指中位数,即获得r个元素中从小到大排在中间的元素(如果r是偶数,取中间两个元素较大的那个)。mod n是指模n的加法,相当于a[n]是一个循环数组。
现输入一个数组a[n],和步长初始值r(1<=r<=n),用f对数组a[n]进行反复的迭代映射(映射结果写回a[n]),每迭代一轮步长r增加1,直到最后一轮r=n之后迭代结束。此时数组a[n]中每一个元素必然完全相同,请把这个元素输出。
提示:
除了对性能和正确性的要求,我们还将重点考察代码书写风格。
输入
第一行是数组的长度n,第二行是r的初始值,之后n行每行是一个整数,对应a[n]中一个元素。
输出
最终收敛值。
样例输入
7
5
1
2
3
4
5
6
7
样例输出
5
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
int r = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
while (r <= n) {
a = doSomething(a, r, n);
r++;
}
System.out.println(a[0]);
}
}
public static int[] doSomething(int[] a, int r, int n) {
int[] b = new int[n];
for (int i = 0; i < n; i++) {
List<Integer> list = new ArrayList<Integer>();
int k = i;
for (int j = 0; j < r; j++) {
list.add(a[k % n]);
k++;
}
Collections.sort(list);
b[i] = list.get(r / 2);
}
return b;
}
}
AC了20%。。。。