• 第二次博客作业


    1、指针(探索中)、类与对象(试图与Java划清界限);

    运用不够熟练,阅读别人代码时容易出错,自己敲代码容易犯语法性错误。对书本中知识点的熟悉程度不够,近期较少认真细读课本。

    2、具体解题报告

    ACM https://vjudge.net/contest/274108#problem/C (华工新手训练题库--青岛赛签到题)WA10 TL3  CE2 AC1

    一个自闭的题目,若暴力解答直接超时,用简易方法规避无效循环会导致错解。

    整体代码如下:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int mp[]={1,0,0,0,1,0,1,0,2,1};
    int g(int x)
    {
        int ans=0;
        int t;
        if(x==0)return 1;
        while(x)
        {
           t=x%10;
           ans+=mp[t];
           x/=10;
        }
        return ans;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        int x,k;
        while(T--)
        {
            scanf("%d%d",&x,&k);
            while(k--)
            {
                x=g(x);
                if(x==0)
                    break;
            }
            if(k>0)
            {
                if(k&1)
                    x=1;
            }
            printf("%d
    ",x);
        }
        return 0;
    }
    

      

    代码主要分两部分

    第一部分是循环语句计算分数并迭代进入下一个函数,这部分较为简单,只要写出提取位数的代码就完事了。

    该题的重点是如何判断结束时间位置,如果暴力循环,会导致极限数据下的TL。看表可知,当x==1||x==0的情况下,终值会在1和0之间循环,最终是0还是1的关键在于循环的次数是奇数还是偶数。

    用&1判断奇偶性就可解决问题。

    该题的思路并不复杂,是属于秒懂思路的类型,但是在解题过程中要观察题目限定时间和自己代码的复杂度,要考虑到如何消除代码中的无用循环是一个解题要点,最后合理使用二进制位运算快速判断解题。

  • 相关阅读:
    C#中的cookie编程
    C# 键值对数据排序
    C#操作json类型数据
    深刻理解C#的传值调用和传引用调用
    .Net程序员玩转Android开发--ListView单击事件
    C#与Visual Basic的异与同
    初识C#程序结构
    【转】Java学习---线程间的通信
    【转】Mysql学习---MySQL悲观锁中的排它锁
    Linux uptime命令详解
  • 原文地址:https://www.cnblogs.com/Never-Land/p/10087346.html
Copyright © 2020-2023  润新知