/*
小团复制粘贴
时间限制: 1000MS
内存限制: 65536KB
题目描述:
小团是一个莫得感情的CtrlCV大师,他有一个下标从1开始的序列A和一个初始全部为-1的序列B,两个序列的长度都是n。他会进行若干次操作,每一次操作,他都会选择A序列中一段连续区间,将其粘贴到B序列中的某一个连续的位置,在这个过程中他也会查询B序列中某一个位置上的值。
我们用如下的方式表示他的粘贴操作和查询操作:
粘贴操作:1 k x y,表示把A序列中从下标x位置开始的连续k个元素粘贴到B序列中从下标y开始的连续k个位置上,原始序列中对应的元素被覆盖。(数据保证不会出现粘贴后k个元素超出B序列原有长度的情况)
查询操作:2 x,表示询问当前B序列下标x处的值是多少。
输入描述
输入第一行包含一个正整数n,表示序列A和序列B的长度。(1<=n<=2000)
输入第二行包含n个正整数,表示序列A中的n个元素,第 i 个数字表示下标为 i 的位置上的元素,每一个元素保证在10^9以内。
输入第三行是一个操作数m,表示进行的操作数量。(1<=m<=2000)
接下来m行,每行第一个数字为1或2,具体操作细节详见题面。
输出描述
对于每一个操作2输出一行,每行仅包含一个整数,表示针对某一个询问的答案。
*/
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
void mcopy(vector<int> &A,vector<int> &B,int k,int x,int y)
{
int i,j;
for(i=x,j=y;i<x+k;i++,j++)
{
B[j]=A[i];
}
}
int main()
{
int n,m;
int i;
vector<int> A,B;
cin>>n;
for(i=0;i<n;i++)
{
int t;
cin>>t;
A.push_back(t);
B.push_back(-1);
}
cin>>m;
for(i=0;i<m;i++)
{
int t1;
cin>>t1;
if(t1==2)
{
int t2;
cin>>t2;
cout<<B[t2-1]<<endl;
}
if(t1==1)
{
int k,x,y;
cin>>k>>x>>y;
mcopy(A,B,k,x-1,y-1);
}
}
return 0;
}
/*
小团深谙保密工作的重要性,因此在某些明文的传输中会使用一种加密策略,小团如果需要传输一个字符串S,则他会为这个字符串添加一个头部字符串和一个尾部字符串。头部字符串满足至少包含一个“MT”子序列,且以T结尾。尾部字符串需要满足至少包含一个“MT”子序列,且以M开头。例如AAAMT和MAAAT都是一个合法的头部字符串,而MTAAA就不是合法的头部字符串。很显然这样的头尾字符串并不一定是唯一的,因此我们还有一个约束,就是S是满足头尾字符串合法的情况下的最长的字符串。
很显然这样的加密策略是支持解码的,给出你一个加密后的字符串,请你找出中间被加密的字符串S。
输入描述
输入第一行是一个正整数n,表示加密后的字符串总长度。(1<=n<=100000)
输入第二行是一个长度为n的仅由大写字母组成的字符串T。
输出描述
输出仅包含一个字符串S。
1.
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,i,l=0,r=0,f1=0,f2=0;
string t;
cin>>n;
cin>>t;
for(i=0;i<n;i++)
{
if(t[i]=='M')
{
f1=1;
}
if(t[i]=='T' && f1==1)
{
l=i+1;
break;
}
}
for(i=n-1;i>0;i--)
{
if(t[i]=='T')
{
f2=1;
}
if(t[i]=='M' && f2==1)
{
r=i-1;
break;
}
}
//cout<<l<<r<<endl;
if(l>r && r!=0)
{
for(i=0;i<=r;i++)
{
cout<<t[i];
}
}
else if(l<r)
{
for(i=l;i<=r;i++)
{
cout<<t[i];
}
}
cout<<endl;
return 0;
}
2.小团的选调计划
时间限制: 1000MS
内存限制: 65536KB
题目描述:
美团打算选调n名业务骨干到n个不同的业务区域,本着能者优先的原则,公司将这n个人按照业务能力从高到底编号为1~n。编号靠前的人具有优先选择的权力,每一个人都会填写一个意向,这个意向是一个1~n的排列,表示一个人希望的去的业务区域顺序,如果有两个人同时希望去某一个业务区域则优先满足编号小的人,每个人最终只能去一个业务区域。
例如3个人的意向顺序都是1 2 3,则第一个人去1号区域,第二个人由于1号区域被选择了,所以只能选择2号区域,同理第三个人只能选择3号区域。
最终请你输出每个人最终去的区域。
输入描述
输入第一行是一个正整数n,表示业务骨干和业务区域数量。(n≤300)
接下来有n行,每行n个整数,即一个1~n的排列,第 i 行表示 i-1 号业务骨干的意向顺序。
输出描述
输出包含n个正整数,第 i 个正整数表示第 i 号业务骨干最终去的业务区域编号
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int is_exit(int a[],int n,int e)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==e)
{
return 1;//存在
}
}
return 0;//不存在
}
int main()
{
int n,i,j,t,len=0;
int a[301],b[301][301];
cin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>t;
b[i][j]=t;
}
for(j=0;j<n;j++)
{
if(is_exit(a,len,b[i][j])==0)
{
a[len++]=b[i][j];
break;
}
}
}
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
全部评论
(2) 回帖