Where_Free

羸弱 无知 自大 懒惰

第二次博客作业

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\n",x);
    }
    return 0;
}

  

代码主要分两部分

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

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

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

 

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

 

posted on 2018-12-08 12:56  Where_Free  阅读(131)  评论(0编辑  收藏  举报

导航