题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1931
题目描述:Jack要选一个最好的海盗。让n个人站成一排,一开始选定第一个人作为mate,然后顺着这一排排人一个一个往前走,如果遇到一个人的缺陷数比当前所选mate少(即做了一次比较),就选定这个更少的人作为mate。求最比较次数最多的人的编号。
思路:直接模拟就可,比较水,只有一点要注意的就是比较关系是相互的,每一次比较都要把当前人和已经选定的mate的比较次数都加1.
代码:
//用g++4.7.2提交,vc++比支持变长数组,回报错 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int n; scanf("%d", &n); int a[n+1], b[n+1]; //b[]记录每个人的比较次数 for (int i = 1; i <= n; ++i) scanf("%d", a + i); memset(b, 0, sizeof(b)); int min = a[1], minindex = 1; for (int i = 2; i <= n; ++i) { ++b[minindex]; ++b[i]; if (a[i] < min) { min = a[i]; minindex = i; } } int maxindex = 1, max = b[1]; for (int i = 2; i <= n; ++i) if (b[i] > max) { max = b[i]; maxindex = i; } printf("%d\n", maxindex); return 0; }