weixin_64417453 2022-09-06 09:05 采纳率: 66.7%
浏览 82
已结题

为什么这么写会超时呀?

**男儿何不带吴钩,收取灯塔五十州。

沙场秋点兵:

刘成将军正在排兵布阵,他要将若干个士兵拍成一排,每个士兵都有一个战斗值x,不同士兵的战斗值可能相同。

假设初始时,队伍为空,但是队伍的正方向朝东(若队伍中有士兵,则他们面朝东,即东边是队伍队首,西边是队伍队尾)

刘成将军会发布以下三条命令:

命令一名士兵从队尾插入队伍

命令一名士兵从队首离开队伍(若队伍里面没有士兵,则忽略此操作)

命令队伍向后转(队伍的正方向改变,队首变为队尾,队尾变为队首。)

输入格式:
第一行一个正整数q(1<=q<=400000),表示命令的数量

接下来q行,

若是 1 x,则将一个战斗值为x的士兵从队尾插入队伍(1<=x<=1000000)。

若是 2,则命令一名士兵从队首离开队伍(若当前队伍中没有士兵,则忽略此操作)

若是 3,则命令队伍向后转

输出格式:
对于每个输入输出一行一个整数,为当前队首和队尾两名士兵的战斗值的异或值(这里的异或是按位异或,运算符为 '^')。

若当前队伍为空,则输出-1**

#include<stdio.h>
int main()
{
    int a[400000]={0};
    int i,j,k,q,m,n,x,s;
    int t=-1;
    scanf("%d",&q);
    for(i=0;i<q;i++){
        scanf("%d",&m);
        if(m==1){    
            scanf("%d",&n);
            t++;                             
            for(j=q-1;j>0;j--)
                 a[j-1]=a[j];
            a[q-1]=n; 
            if(a[q-1]==a[q-1-t])x=0;    
            else x=1;
            printf("%d\n",x);
        }
        else if(m==2){
            t--;
            if(t<0)printf("-1\n");
            else{
                if(a[q-1]==a[q-1-t])x=0;    
                else x=1;
                printf("%d\n",x);
            }
        }
        else if(m==3){
            for(j=0;j<=(t+1)/2;j++){
                s=a[q-1-t];
                a[q-1-t]=a[q-1-j];
                a[q-1-j]=s; 
            }
            if(a[q-1]==a[q-1-t])x=0;    
            else x=1;
            printf("%d\n",x);
        }
    }
}

  • 写回答

1条回答 默认 最新

  • 於黾 2022-09-06 09:23
    关注

    向后转的时候你不要真的把整个数组倒转,那多消耗时间啊
    你只需要判断队伍到底朝向哪边
    如果朝正方向,那么从队尾进入,队首离开;
    如果朝反反向,那么从队首进入,从队尾离开

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月14日
  • 已采纳回答 9月6日
  • 创建了问题 9月6日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程