第一题-洗牌
思路:
收先确定输入组数,然后确定每组数据大小,然后将每组数据依次存放到card中,之后洗牌按照规律 card[2*j] = tmp[j]; card[2*j+1] = tmp[n+j]; 最后输出
#include<iostream>
#include<vector>
using namespace std;
int main ()
{
//T代表有T组数据,n代表牌长度的一半,k代表洗牌次数
int T, n, k;
cin>>T;
while(T--)
{
cin>>n>>k;
int num = 2*n;
vector<int> card(num);
//将牌存到card中
for(int i = 0 ; i < num; ++i)
{
cin>>card[i];
}
//洗牌k次
for(int i = 0; i < k; ++i)
{
vector<int> tmp(card.begin(), card.end());
for(int j = 0; j < n; ++j)
{
card[2*j] = tmp[j];
card[2*j+1] = tmp[n+j];
}
}
//输出牌
for(int i = 0; i < num-1; ++i)
{
cout<<card[i]<<" ";
}
cout<<card[num-1]<<endl;
}
return 0;
}
第二题-MP3光标位置
思路:
首先将情况分为两大类,小于等于4和大于4,定义两个变量num代表当前页面光标所在的位置,frist代表当前页面的起始位置,之后根据题目描述编写即可
#include<iostream>
#include<string>
using namespace std;
int main ()
{
int n ;
string str;
while(cin>>n>>str)
{
//num代表当前页数指向的歌曲,frist代表当前的页数第一首歌编号
int num = 1, frist = 1;
//如果歌曲数量小于等于4
if(n<=4)
{
for(int i = 0; i < str.size(); ++i)
{
if(num == 1 && str[i] == 'U')
num = n;
else if(num == n && str[i] == 'D')
num = 1;
else if(str[i] == 'U')
num--;
else
num++;
}
//输出
for(int i = 1; i <= n; ++i)
cout<<i<<" ";
cout<<endl;
cout<<num<<endl;
}
//如果歌曲数量大于4
else
{
for(int i = 0; i < str.size(); ++i)
{
if(frist == 1 && num == 1 && str[i] == 'U')
{
frist = n-3;
num = n;
}
else if(frist == n-3 && num == n && str[i] == 'D')
{
frist = num = 1;
}
else if(frist != 1 && num == frist && str[i] == 'U')
{
frist--;
num--;
}
else if(frist != n-3 && num == frist+3 && str[i] == 'D')
{
frist++;
num++;
}
else if(str[i] == 'U')
num--;
else
num++;
}
//输出
for(int i = frist; i <= frist+3; ++i)
cout<<i<<" ";
cout<<endl;
cout<<num<<endl;
}
}
return 0;
}