题目链接

Problem Description

Davy Jones has captured another ship and is smiling contently under the sun. Today is a good day for him. He will get more souls to serve on his crew. The day, however, looks so nice, the sun shining brightly above all and the ocean spilled calmly around, that he decides to be merciful and give some

chance to the wretched seamen of the captured ship. He decides to play the following game.

He will line a group of captives in front of him, and then write a number of his choice on each

man’s forehead. After that, he wants to check if the set of numbers is 3-free. What does it mean for a set to be 3-free? It means that there are no 3 numbers in the set that form an increasing arithmetic progression (weird games have damned Jones, aye), i.e., a sequence of numbers such that the difference of any two successive members of the sequence is a positive constant, such as {1 2 3}, {4 6 8}, or {-2, 1, 4}. If the the set of numbers on men’s foreheads is 3-free, the group is free, too (what an irony).

However, if not, those who have the numbers of the lexicographically first triple that proves (i.e. is a witness) that the set is not 3-free will serve on Jones’ crew for an eternity.

And you ... You will be Jones’ assistant in this game. Checking each group whether it is 3-free or not. And you’d better check right or you will end up on Jones’ crew as well.

A triple (a1, a2, a3) is an increasing arithmetic progression if a2-a1=a3-a2, and a2-a1>0.

A triple (a1, a2, a3) is lexicographically smaller than (b1, b2, b3) if

a1 < b1, or

a1 = b1 and a2 < b2, or

a1 = b1, a2 = b2 and a3 < b3.

Note that you will be looking at triples (a1, a2, a3) of increasing order, i.e. a1 ≤ a2 ≤ a3. The numbers on men’s foreheads need not be in increasing order though.

Input

Input consists of a single line with the numbers written on the captured men’s foreheads. The first number of the line denotes how many men are there in the group(it will not exceed 10000) and should not be included in the sequence.

Output

Output should consist of a single line. If the sequence of numbers in the input is 3-free, output “Sequence is 3-free.” If the sequence is not 3-free, output “Sequence is not 3-free. Witness: w1, w2, w2.” (note the intervals after the first dot and the colon), where w1, w2, w3 is the lexicographically first witness that the sequence is not 3-free.

Sample Input`

4 1 5 6 8

7 1 3 5 2 -7 0 -1`

Sample Output`

Sequence is 3-free.

Sequence is not 3-free. Witness: -7,-1,5.`

题目分析:

要求给出的一组数据中任意的三个数不能构成"3-free"(即三个数不能够是公差大于零的等差数列),为了方便查找我们可以先把给出的这组数据按照升序排列,然后循环找出首项和末项,再判断他们的中间项是不是在这组数据中。

找中间项时如果还用for循环查找的话,相当于三层for循环嵌套,所需要的运行时间太大,可以用set容器或则map容器优化这个查找过程。

三层for循环嵌套(超时)

    #include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
using namespace std;
int a[10009];
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(&a[0],&a[n]);//因为要看能否构成等差数列我们
//先给数据排序这样方便后面的比较
int op=0; //op作为一个标记,看看后面是否满足条件的
for(i=0; i<n; i++)
{
for(j=i+2; j<n; j++)
{
int m,bj=0;
m=(a[i]+a[j])/2;
for(int k=0; k<n-1; k++) // 因为多加了一个找中间值的循环,运行时间会超限
{
if(a[k]==m)
{
bj=1;
break;
}
}
if(bj==1)
{
if((a[i]+a[j])%2==0)//保证中间的那个数是满足条件的整数
{
op=1;
printf("Sequence is not 3-free. Witness: %d,%d,%d.\n",a[i],(a[i]+a[j])/2,a[j]);
break;
}
}
}
if(op==1)break;
}
if(op==0)
printf("Sequence is 3-free.\n");
}
return 0;
}

set容器优化

    #include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
using namespace std;
int a[10009];
int main()
{
int n,i,j;
set<int>s;
while(~scanf("%d",&n))
{
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
s.insert(a[i]);
}
sort(&a[0],&a[n]);
int op=0;
for(i=0; i<n; i++)
{
for(j=i+2; j<n; j++)
{
if((a[i]+a[j])%2==0&&s.find((a[i]+a[j])/2)!=s.end())//保证中间的那个数是满足条件的整数,
//且存在于输入的数据中
{
op=1;
printf("Sequence is not 3-free. Witness: %d,%d,%d.\n",a[i],(a[i]+a[j])/2,a[j]);
break;
}
}
if(op==1)break;
}
if(op==0)
printf("Sequence is 3-free.\n");
}
return 0;
}

map容器优化

    #include<iostream>
#include<stdio.h>
#include<map>
#include<algorithm>
using namespace std;
int a[10009];
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
map<int,int>m;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
m[a[i]]=1;
}
sort(&a[0],&a[n]);
int op=0; //op作为一个标记,看看后面是否满足条件的
for(i=0; i<n; i++)
{
for(j=i+2; j<n; j++)
{
if((a[j]+a[i])%2==0&&m[(a[j]+a[i])/2]==1)//保证中间的那个数存在
{
op=1;
printf("Sequence is not 3-free. Witness: %d,%d,%d.\n",a[i],(a[i]+a[j])/2,a[j]);
break;
}
} if(op==1)break;
}
if(op==0)
printf("Sequence is 3-free.\n");
}
return 0;
}

HDU 2593 Pirates’ Code (STL容器)的更多相关文章

  1. Windows中VS code无法查看C++ STL容器的值 - 解决方法

    Windows中VS code debug时无法查看C++ STL容器内容 首先,你很可能用的是x64版本的Windows. 我发现一个有效的解决方法,但在x64版本的Windows上安装MinGW时 ...

  2. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  3. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  4. STL容器删除元素的陷阱

    今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...

  5. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  6. GDB打印STL容器内容

    GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...

  7. STL容器迭代器失效分析

    连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效, ...

  8. STL容器的适用情况

     转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...

  9. STL容器的遍历删除

    STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...

随机推荐

  1. 软工网络15团队作业4——Alpha阶段敏捷冲刺-6

    一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 完成对账单的编辑,删除等操作,以及开始服务器的编写工作 明天计划完成的工作: 记账功能基本完成,进一步优化功能与完善服务器 工作中遇到的困难 ...

  2. Linux架设DDNS服务器之自动更新脚本

    问题描述:客户端是动态IP,每次连网之后要nsupdate下才可以把客户端的hostname 与IP映射更新到DNS Server上 命令如下: nsupdate -k K*****.key > ...

  3. Linux 下定位java应用 cpu高的原因(转)

    使用场景: 遇到Linux下java应用cpu占用很高的时候,我们很想知道此时的应用到底在做什么导致资源的消耗. 方便我们进一步定位和优化~ 1.查询cpu耗用top5的进程(你也可以top10) [ ...

  4. ios基础动画、关键帧动画、动画组、转场动画等

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  5. Linux学习笔记一:Linux配置java环境变量

    一.安装JDK: 1.创建JDK的安装目录: sudo mkdir /usr/jdk 2.将jdk-7u25-linux-x64.tar.gz拷贝至/usr/jdk目录下 sudo cp jdk-7u ...

  6. 【NOIP考试范围】

    ※号为可能考察的算法[历年有出现过,但概率小,但最好掌握] [本图片仅作参考] 梦想总是要有的,万一实现了呢?

  7. 第一个python教程(1)

    使用文本编辑器 在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为 ...

  8. linux top命令查看系统资源

    参考材料: http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html

  9. Hbase(四) 过滤器查询

    引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: 一.hbase过滤器的分类 1.比较过滤器 行键过 ...

  10. position:fixed 相对父元素定位

    position:fixed是对于浏览器窗口定位的,要实现相当于父元素定位,可以这样: 不设置fixed元素的top,bottom,left,right,只设置margin来实现. 这种方法本质上fi ...