codeforces #731 (div. 3)

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值