Watto and Mechanism CF581C(模拟水题)
2016-07-10 00:34
323 查看
点击打开链接
题意分析: 每k个软件在同一屏幕上,一共有n个软件,设要点开的手机软件当前位置为x,每次需要翻(x / k )页屏幕,并且点击一下软件才能打开。所以每次打开该软件需要做(x / k + 1)次指令,之后该软件的位置向前移一位(只要不是第一个软件)一共打开m次,求一共需要做多少次指令。开两个数组,一个记录软件标号,一个记录软件当前位置,每次将目标软件与它前面的软件(如果前面有的话)交换位置即可。
题意分析: 每k个软件在同一屏幕上,一共有n个软件,设要点开的手机软件当前位置为x,每次需要翻(x / k )页屏幕,并且点击一下软件才能打开。所以每次打开该软件需要做(x / k + 1)次指令,之后该软件的位置向前移一位(只要不是第一个软件)一共打开m次,求一共需要做多少次指令。开两个数组,一个记录软件标号,一个记录软件当前位置,每次将目标软件与它前面的软件(如果前面有的话)交换位置即可。
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<string> #include<map> #include <algorithm> using namespace std; const int maxn = 100010; int a1[maxn],a2[maxn]; long long m, n, k; int main() { // memset(a1, 0, sizeof(a1)); // memset(a2, 0, sizeof(a2)); scanf("%lld%lld%lld",&n,&m,&k); for(int i = 0; i < n; i++) { scanf("%d",&a1[i]); a2[a1[i]] = i; } long long sum = 0,t; for(int i = 0; i < m; i++) { scanf("%lld",&t); sum += a2[t] / k + 1; if(a2[t]) { //交换t, a2[t], a2[t]-1, a1[a2[t] - 1] int p1 = a2[t], v1 = t; int p2 = p1 - 1, v2 = a1[p2]; a1[p1] = v2; a1[p2] = v1; a2[v1] = p2; a2[v2] = p1; } } printf("%lld\n",sum); return 0; }