xtu补考题解

本文提供了XTU编程题的解题思路,包括机器人回到原点问题的解决方案,以及一系列算法题目的解析,如字符串处理、回文子序列等。文章强调代码仅供参考学习,不建议照搬,并分享了一些编程技巧和常用模板库的介绍。
摘要由CSDN通过智能技术生成

转载注明出处:http://blog.csdn.net/xtulollipop

受一朋友委托,写了这个题解供大家学习使用,本文代码只是自己看到题目后写的,并没有交题验证过其正确性,因此仅供参考学习交流使用。也请勿照抄代码。不喜勿碰!

Robot
题目描述
机器人一开始站在原点,可以上下左右(分别用“UDLR”表示)移动,每次移动一步。Estrella想知道对于某个指令序列,如果把一种指令全部替换成另一种指令,新的指令序列是否可以让机器人回到原点。
输入
存在多个样例,每个样例一行,为一条指令序列,长度不超过200。
输出
每行输出一个样例的结果,可以输出“Yes”,否则输出“No”。
样例输入
LD
LLDDD
样例输出
Yes
No

对于这个问题,如果要是机器人回到原点,那么L,R的数目应该相等,U,D的数目也应该相等。由于题目说了把其中一种全部替换,那么这个题要使得机器人回到原点那么有L=R或者U=D,所以我们只需要对这种情况进行判断就行。

#include<bits/stdc++.h>
using namespace std;
int main(){
    char a[222];
    while(scanf("%s",a)!=EOF){
        int L=0,R=0,U=0,D=0;
        for(int i=0;i<strlen(a);i++){
            if(a[i]=='L') L++;
            else if(a[i]=='R') R++;
            else if(a[i]=='U') U++;
            else if(a[i]=='D') D++;
        }
        bool ok=false;
        //判断L==R,把U替换和把D替换
        if(L==R+U||L==R+D||R==L+U||R==L+D) ok=true;
        //判断D==U
        if(D==U+L||D==U+R||U==D+L||U==D+R) ok=true;
        if(ok) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

这里写图片描述

对于这个题,每一行,每一列中只要有一个黑色的那么这一行,这一列是不会被刷成红色的,因此每输入一个点,我就标记行列是否有红色,最后我只要知道有多少行,多少列没出现过黑色,那么我就可以知道又少个各自被涂成红色了,,h*m+l*n-h*l,h行的个数每行格子数+列数每列格子数-行列交叉点(多算了一次)。


    #include<cstdio>
    using namespace std;
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            int hang[110],lie[110];
            int n,m,k,x,y;
            scanf("%d %d %d",&n,&m,&k);
            for(int i=1;i<=110;i++){
                hang[i]=0;
                lie[i]=0;
            }
            for(int i=1;i<=k;i++){
               scanf("%d %d",&x,&y);
               hang[x]=1;//标记行是否出现过黑色
               lie[y]=1;//标记列是否出现过黑色
            }
            int h=0,l=0;

            for(int i=1;i<=n;i++){
                if(hang[i]==0) h++;
            }
            for(int i=1;i<=m;i++){
                if(lie[i]==0) l++;
            }
            printf("%d\n",h*m+l*n-h*l);
        }
        return 0;
    }

这里写图片描述
整套题里,最烦的一到模拟题题了。。用一个数组表示是否有课,检查连着的T节课是否全是空的,且时间全是上午,下午或晚上。

    #include<bits/stdc++.h>
    using namespace std;
    char week[8][8]={
  "","Mon","Tue","Wen","Thur","Fri","Sat","Sun"};
    int main(){
        int T_T;
        scanf("%d",&T_T);
        while(T_T--){
            int N,T;
            scanf("%d %d",&N,&T);

            int xin[11][11];//星期几,第几节课,1代表有课,0代表没课
            memset(xin,0,sizeof(xin));
            char D[11];
            int S,E;
            for(int i=1;i<=N;i++){
                scanf("%s %d %d",D,&S,&E);
                for(int j=1;j<=7;j++){
                    if(strcmp(D,week[j])==0){
                        for(int k=S;k<=E;k++) xin[j][k]=1; //星期一S到E节课有课。。
                    }
                }
            }
            int cnt=0;
            //找到没课节数等于考试数T的地方
            for(int i=1;i<=5;i++){
  //枚举星期1-5
                for(int s=1;s<=11;s++){ //枚举开始的节数
                    int num=0,jie;
                    for(jie=0;jie<T;jie++){ //连着的T节课
                       num+=xin[i][s+jie]; //只要num!=0,表示连着的T课时间里有课。
                       if(s+jie==4||s+jie==8||s+jie==11){
  //上午,下午,晚上分界处,
                           if(jie==T-1&&num==0) cnt++;  //循环到了T截课(循环没执行完T-1)
                           break;
                       }
                    }
                    if(jie==T&&num==0) cnt++;//盘jie==T,是检查是否是上下午晚上时间段的
                }
            }
            printf("%d\n",cnt);//与上边相同,只是在cnt++的地方改成输出就好了。

            for(int i=1;i<=5;i++){
                for(int s=1;s<=11;s++){
                    int num=0,jie;
                    for(jie=0;jie<T;jie++){
                       num+=xin[i][s+jie];
                       if(s+jie==4||s+jie==8||s+jie==11){
                           if(jie==T-1&&num==0) printf("%s %d %d\n",week[i],s,s+jie);
                           break;
                       }
                    }
                    if(jie==T&&num==0) printf("%s %d %d\n",week[i],s,s+jie);
                }
            }
        }
        return 0;
    }

这里写图片描述
这个题,其实就是找规律的题,全场都没有人出,自己写了样例都过不去,后来几个人在一起对拍了数据,发现这题数据好像出错了。然后找了老师,果然他数据错了。。so。。怪谁呢。。。1000000000的那个样例的答案因该是499999881。。

然后说一下这个题,,观察几行可以发现规律 1,22,2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值