书上具体所有题目:http://pan.baidu.com/s/1hssH0KO


代码:(Accepted,20 ms)

//UVa1594 - Ducci Sequence
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int T,N;
bool is_zero(vector<int> &d) {
for (const auto &i : d)
if (i) return false;
return true;
} int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d", &T);
while (T--) {
scanf("%d", &N);
vector<int> D(N);
for (auto &i : D) scanf("%d", &i);
int i = -1;
while (++i<200) {
int D0 = D[0];
for (int i = 0;i < N-1;++i)
D[i] = abs(D[i] - D[(i + 1)]);
D[N - 1] = abs(D[N - 1] - D0);
if (is_zero(D)) break;
}
printf(i==200?"LOOP\n": "ZERO\n");
}
return 0;
}

题意:一个数组每次做一定变换,问最后他是循环了还是数据全都变成0了。


分析:模拟每一步,没什么思路。但是纯模拟量很大。

一开始我直接无限模拟每一步,看是不是全变成0了,还是有没有进入循环。

用了set来存储每一步的结果,用set的count函数来判断是不是进入循环了。代码如下:

//UVa1594 - Ducci Sequence
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
int T,N;
bool is_zero(vector<int> &d) {
for (const auto &i : d)
if (i) return 0;
return 1;
} int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d", &T);
while (T--) {
scanf("%d", &N);
vector<int> D(N);
set<vector<int> > P;
for (auto &i : D) scanf("%d", &i);
P.insert(D);
while (1) {
vector<int> D2(N);
for (int i = 0;i < N;++i)
D2[i] = abs(D[i] - D[(i + 1) % N]);
if (is_zero(D2)) { printf("ZERO\n"); break; }
if (P.count(D2)) { printf("LOOP\n"); break; }
D = D2;
P.insert(D);
}
}
return 0;
}

但是结果把我从椅子上吓得掉下去:“Time: 520 MS”!一口老血喷了出来(与上面最终提交的结果差了十万八千里!)。想了想,问题在哪里呢?于是去网上看了大神们的做法:他们都没有做数据是否循环的检查。原来如此,虽然set的检查已经很快了,但是如此庞大的检查量还是不敢恭维。直接不检查,1000次循环,要么出现全0,否则就是循环了,题目给你保证了不过1000的。现在知道了,原来还可以这么玩!

于是我又去除set的循环检查又提交一遍,100ms。那么与别人的40ms、50ms又差在哪儿呢?一看,人家只循环了500次甚至更少。为什么呢?我试了200,依然AC。想找点规律会不会保证它在200之内必有结果,没找出来。或许是题目的数据太水了原因。(本来猜想只要有一半的数字是一样的就应该是loop,想提交试试的,但是想想加个这样的判断并不合算)所以100ms差不多了。像我这样算是钻空子了。

[刷题]算法竞赛入门经典(第2版) 5-2/UVa1594 - Ducci Sequence的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  2. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  3. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  4. [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...

  5. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation

    题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...

  6. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  7. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  8. [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities

    题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...

  9. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  10. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web

    题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...

随机推荐

  1. Python注释用法

    在Python中的注释与其他语言相比有很大的不同,但使用起来也很简单.在Python中有两种注释,一种是单行注释,一种是多行注释.单行注释适用于简短快速的注释(或者用于调试),而块注释常用于描述一段内 ...

  2. Linux命令--su与sudo

    su(switch user)命令的作用:切换用户,一般是普通用户与root用户之间的切换.例:>su                #输入su命令Password:      #提示输入密码 ...

  3. JavaScript如何一次性展示几万条数据

    有一位同事跟大家说他在网上看到一道面试题:“如果后台传给前端几万条数据,前端怎么渲染到页面上?”,如何回答? 于是办公室沸腾了, 同事们讨论开了, 你一言我一语说出自己的方案. 有的说直接循环遍历生成 ...

  4. 光环国际的PRINCE2培训是怎么上课的?

    一.面授班级: 基础级:3天知识精讲(含案例分享+现场演练) 上课时间:上午9:00-12:00,下午1:30-4:30分 考试时间:第3天课程结束后5:30-6:30分 1 个小时闭卷考试   专业 ...

  5. 更全面的聊聊PRINCE2是什么

    1 什么是PRINCE2®? PRINCE2是一个非专有方法,已在全世界超过150个国家广泛使用,采用它的组织正在与日俱增. 它被广泛认为是项目管理的领先方法,超过2万个组织已经从其开创性的可信方法中 ...

  6. my first blogs(我的处女博)

    末夏的夕阳送走一批批下班的人,些许的轻风给一天烦躁的心带来一丝丝的清凉.我倒是挺喜欢在这种天气,提前下了公交车然后漫步回家.这样我能多点时间回顾一天的事情,俗话说是思考人生. 不知不觉毕业两年多了,在 ...

  7. js随机模块颜色

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  8. Web worker 与JS中异步编程的对比

    0.从一道题说起 var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert('end'); 问,以上代码何 ...

  9. 使用mysql索引技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  10. C++中的类继承(4)继承种类之单继承&多继承&菱形继承

    单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...