V
题目就是求两点之间最短距离
当遇到三个点x一样或者y一样并且障碍点是夹在两个点之间,答案+2;
代码
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[100005]= {0};
int main()
{
int t,x1,y1,x2,y2,x0,y0;
int sum,temp;
scanf("%d",&t);
while(t--)
{
getchar();
scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x0,&y0);
if(x1>x2)
{
temp=x1;
x1=x2;
x2=temp;
}
if(y1>y2)
{
temp=y1;
y1=y2;
y2=temp;
}
if(x1==x2&&(x1==x0)&&(y1<y0&&(y0<y2)))
{
sum=y2-y1+2;
}
else if(y1==y2&&(y1==y0)&&(x1<x0&&(x0<x2)))
{
sum=x2-x1+2;
}
else sum=y2-y1+x2-x1;
printf("%d\n",sum);
}
return 0;
}
题意
对一个空字符串进行操作
第i布可将按照字母顺序第i个加入到字符串的头或者尾巴中
直到出现给定的字符串
思路
如果字符串长度为n,不能出现超过顺序大于n的字母,每个字母出现不超过一次
每个字母的左右边必须要有比自己顺序小的字母
代码
#include<bits/stdc++.h>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
int main()
{
int t,len,temp;
string s;
scanf("%d",&t);
while(t--)
{
temp=0;
map<char,int>cnt;
cin>>s;
len=s.size();
for(int i=0;i<len;i++)
{
cnt[s[i]]++;
if(cnt[s[i]]>1)//字母出现超过一次
{
temp=1;
break;
}
if(s[i]-'a'>=len)//出现超过长度的字母
{
temp=2;
break;
}
if(i>=1&&(len-i>1)&&s[i]>s[i-1]&&s[i]>s[i+1])//中间的字母比两边都大
{
temp=3;
break;
}
}
if(temp==0)printf("YES\n");
else printf("NO\n");
}
return 0;
}
代码
#include<bits/stdc++.h>
#include<queue>
using namespace std;
int t,k,n,m,sum,temp;
int a[200]= {0},b[200]={0};
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&k,&n,&m);
sum=k;temp=0;
for(int i=1; i<=n; i++)scanf("%d",&a[i]);a[n+1]=100000;
for(int i=1; i<=m; i++)scanf("%d",&b[i]);b[m+1]=100000;
int i=1,j=1;
queue<int>q;
while(i<=n||j<=m)
{
while(a[i]==0&&i<=n) {q.push(a[i]);sum++;i++;}
while(b[j]==0&&j<=m) {q.push(b[j]);sum++;j++;}
if(a[i]<=sum&&i<=n) {q.push(a[i]);i++;}
if(b[j]<=sum&&j<=m) {q.push(b[j]);j++;}
//if(i==n+1&&j==m+1)break;
if(a[i]>sum&&b[j]>sum) {break;}
//if(b[j]>sum&&a[i]!=0) {temp=-1;break;}
}
if(q.size()<n+m) printf("-1\n");
else
{
for(i=1;i<=n+m;i++)
{
int x=q.front();
printf("%d ",x);
q.pop();
}
printf("\n");
}
}
return 0;
}
D
#include <bits/stdc++.h>
#include<math.h>
#define ll long long
using namespace std;
ll er(ll x,ll y)
{
if(x>y)swap(x,y);
ll t,a[10000]={0},b[10000]={0},i=0,j=0;
while(x!=0)
{
a[i]=x%2;
i++;
x=x/2;
}
/*for(int k=i-1;k>=0;k--)printf("%d",a[k]);
printf("\n");*/
while(y!=0)
{
b[j]=y%2;
j++;
y=y/2;
}
/*for(int k=j-1;k>=0;k--)printf("%d",b[k]);
printf("\n");*/
for(int k=i-1; k>=0; k--)
{
if(a[k]==1&&b[k]==0)
b[k]=1;
}
/*for(int k=j-1;k>=0;k--)
printf("%d",b[k]);
printf("\n");*/
y=b[0];
for(int k=1; k<j; k++)
{
y=y+b[k]*pow(2,k);
}
return y;
}
/*int change(int xx,int yy)
{
int a[100];
memset(a,0,sizeof(a));
int x=xx,y=yy;
int cnt=0;
while(xx>0&&yy>0)
{
if(xx%2==1&&yy%2==0)
{
a[cnt]=1;
}
cnt++;
}
int ans=y;
for(int i=0; i<cnt; i++)
{
if(a[i])
ans+=pow(2,i);
}
return ans;
}*/
int main()
{
ll t,temp,s[200005]={0};
scanf("%lld",&t);
//printf("%d\n",er(60,6));
while(t--)
{
ll n,x;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);//printf("1 \n");
if(i==1)
{
temp=x;
s[i]=0;
}
else
{
s[i]=er(temp,x)^x;
temp=x^s[i];
//printf("%d ",temp);
}
}
//printf("\n");
for(int i=1;i<=n;i++) printf("%d ",s[i]);
printf("\n");
}
return 0;
}