快捷键的难题

从一个编程网站上搞过来的题目,自己解了一下,发现就是类似于字符串旋转的问题:

题目描述:
Windows 7系统有很多的快捷键,Y同学最喜欢的快捷键就是Alt+Tab组合键,可以进行方便的进行多窗口之间的切换。为了方便,去掉一些复杂规则后,Y同学进行了如下定义。
1.窗口队列:w1,w2,……wi……wn, (1<=i<=n, n为窗口数目)。队首w1表示当前为激活状态的窗口。
2.一次切换动作switch(x):
(1)按住Alt键不放
(2)敲击x次Tab键
(3)放开Alt键
3.一次切换动作switch(x)产生的影响:举例说明
(1)窗口队列 1,2,3,4,5,6 经过switch(1)之后,成为2,1,3,4,5,6
(2)窗口队列 1,2,3,4,5,6 经过switch(2)之后,成为3,1,2,4,5,6
(3)窗口队列 1,2,3,4,5,6 经过switch(5)之后,成为6,1,2,3,4,5
(4)窗口队列 1,2,3,4,5,6 经过switch(6)之后,成为1,2,3,4,5,6
(5)窗口队列 1,2,3,4,5,6 经过switch(8)之后,成为3,1,2,4,5,6
那么Y同学想知道,对于初始窗口队列(1,2,3……n)进行多次switch(x)切换之后,当前激活窗口的ID是多少?请你帮助他解决这个问题。
输入:
第一行为一个正整数:T(T<30)。T表示有多少组测试数据
每一组测试数据
第一行:n m。(0,n表示窗口队列的长度,m表示有m次switch操作。
第二行:m个正整数x1,x2,……,xi,……xm。表示第i次进行switch(xi)操作;
输出:
对于每组数据,输出经过m次switch操作之后,当前激活窗口的ID。
样例输入:
2
6 2
3 8
8 3
4 3 14
样例输出:
2
7


给出解答:

#include<iostream>
using namespace std;

void swap(int &a, int &b) {
	b ^= a;
	a ^= b;
	b ^= a;
}

void exchange(int *start, int *end) {
	while (start < end) {
		swap(*start, *end);
		start++;
		end--;
	}
}

void blockExchange(int arr[], int low, int mid, int high) {
	exchange(arr + low, arr + mid);
	exchange(arr + mid + 1, arr + high);
	exchange(arr + low, arr + high);
}

int main(int argc, char *argv[]) {
	int i;
	int ntimes;
	int *rst;
	cin >> ntimes;
	rst = new int[ntimes];
	int count = 0;
	while (count < ntimes) {
		int n, m;
		cin >> n >> m;
		int *arr = new int[n];
		for (i = 0; i < n; i++)
			arr[i] = i + 1;
		int *sw = new int[m];
		for (i = 0; i < m; i++)
			cin >> sw[i];
		for (i = 0; i < m; i++) {
			int temp = sw[i] % n;
			blockExchange(arr, 0, temp - 1, temp);
		}
		rst[count++] = arr[0];
		delete []arr;
		delete []sw;
	}
	for (i = 0; i < ntimes; i++)
		cout << rst[i] << endl;
	delete []rst;
	cin.get();
	cin.get();
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值