第二次博客作业
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 阅读(132) 评论(0) 编辑 收藏 举报