思路:一开始以为只要找到俩端存在最先不相同的点即可,后面发现
63433465
63334456
头第一个不相同的点是3,但是最长是2开始。
所以找到最先不相同的点之后再往俩边扩展即可
#include<iostream>
using namespace std;
int a[200005];
int b[200005];
int main(){
int t;
cin>>t;
while(t--)
{
int n,t1=0,t2=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
cin>>b[i];
}
//找到俩端最先不相同的点
for(int i=0;i<n;i++)
{
if(a[i]!=b[i]){
t1=i;
break;
}
}
for(int i=n-1;i>=0;i--)
{
if(a[i]!=b[i]){
t2=i;
break;
}
}
//扩展
int tm1=b[t1],tm2=b[t2];
while(t1>0&&a[t1-1]<=tm1)
{
//扩展左边
tm1=a[t1-1];
t1--;
}
while(t2<n-1&&a[t2+1]>=tm2)
{
//扩展右边
tm2=a[t2+1];
t2++;
}
cout<<t1+1<<" "<<t2+1<<endl;
}
}
思路:只要存在 '_' 相连的情况中间就需要加一个 ' ^ ' ,首和尾为’_‘的时候需要在前或者后插入’^‘,最后特判一下只有一个^的情况即可。
//_ _ _^_^ ^^_^_ _ _^
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
cin>>n;
string s;
while(n--){
cin>>s;
int cnt=0;
int n=s.size();
if(s[0]=='^'&&n==1)
{
cout<<1<<endl;
continue;
}
if(s[0]=='_')cnt++;
if(s[n-1]=='_')cnt++;
for(int i=0;i<n-1;i++){
if(s[i]=='_'&&s[i+1]=='_')
{
cnt++;
}
}
cout<<cnt<<endl;
}
}
思路:不存在一个点到另一个点的路径的时候,最优的情况是其中一个点的四周都有障碍物;
讨论一下位于边界的情况下需要放障碍物的个数即可
#include<iostream>
using namespace std;
int main(){
int t;
cin>>t;
while(t--)
{
int N1=4,N2=4;
int x1,y1,x2,y2;
int n,m;
cin>>n>>m;
cin>>x1>>y1>>x2>>y2;
if(x1==n||x1==1)
{
N1--;
}
if(y1==m||y1==1)
{
N1--;
}
if(x2==n||x2==1)
{
N2--;
}
if(y2==m||y2==1)
{
N2--;
}
cout<<min(N1,N2)<<endl;
}
}
项目:
1:登录注册写着写着又出bug了,改了一天没改好。
2:主界面的编写。