一、第一周任务 - Virtual Judge (vjudge.net)
1、这题是说有两个数组,对其中一个数组的子数组,进行升序排序后当前数组和另一个数组一致,我们需要找出这个最长子数组。
2、首先我们需要先确定基础范围,在向两边试探性搜索。
3、就是先(从左往右和从右往左)找出当前数组和另一个数组不一样的开始下表,l,r;
4、再然后我们需要l往左试探,r往右试探,l的左边比l小,r的右边比r打,就l--,r++,直到不满足试探条件或是到了边界就停止;
附代码
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
int a1[300005];
int a2[300005];
main(){
int n;
cin>>n;
while(n--){
int m,l,r;
cin>>m;
for(int i=1;i<=m;i++)
cin>>a1[i];
for(int i=1;i<=m;i++)
cin>>a2[i];
for(int i=1;i<=m;i++)
if(a1[i]!=a2[i]){
l=i;
break;
}
for(int i=m;i>=1;i--)
if(a1[i]!=a2[i]){
r=i;
break;
}
sort(a1+l,a1+r+1);
for(int i=l-1;i>=1;i--){
if(a1[i]<=a1[i+1])l=i;
else break;
}
for(int i=r+1;i<=m;i++){
if(a1[i]>=a1[i-1])r=i;
else break;
}
cout<<l<<" "<<r<<endl;
}
}
二、第一周任务 - Virtual Judge (vjudge.net)
1、这一题其实就是暴力穷举,我们首先获取这个字符串有多少种字符,放到一个数组。
2、并且获得这个字符在字符串中有多少个,然后就枚举每种字符,当做最后剩的字符,将其他字符按照删除规则删掉其他字符,算出有多少步,取所有枚举情况中最少的次数
附代码
#include <iostream>
#include<algorithm>
#include<map>
#include<string.h>
using namespace std;
int pd(string str,char max,int cs){
int k=0,x2=0;
char jl2[200005];
for(int i=0;i<str.length();i++)
{jl2[i]=str[i];jl2[i+1]='\0';}
while(cs!=strlen(jl2)){
k++;
int cd=strlen(jl2);
for(int i=0;i<cd;i++){
if(jl2[i]!=max){jl2[x2++]=jl2[++i];}
else {jl2[x2++]=jl2[i];}
}
jl2[x2]='\0';
x2=0;
}
return k;
}
main(){
int n;
cin>>n;
while(n--){
string str;
char jl[200005];
int x=0,cs=0,k=1000000;
map<char,int>pj;
cin>>str;
for(int i=0;i<str.length();i++){
if(pj[str[i]]==0)jl[x++]=str[i];
pj[str[i]]++;
}
jl[x]='\0';
for(int i=0;i<x;i++)
if(pj[jl[i]]>cs){
cs=pj[jl[i]];
}
if(cs>1){
for(int i=0;i<x;i++){
int m=pd(str,jl[i],pj[jl[i]]);
if(m<k)k=m;
}
cout<<k<<endl;
}
else {
int cd=str.length();
int k=0;
while(cd!=1){
cd/=2;
k++;
}
cout<<k<<endl;
}
}
}