zoukankan      html  css  js  c++  java
  • 紫书第五章训练 uva 1594 Ducci Sequence by crq

    Description

    A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1a2, ... an), the next n-tuple in the sequence is formed by taking the absolute differences of neighboring integers:

    a1a2... an$displaystyle 
ightarrow$ (| a1 - a2|,| a2 - a3|, ... ,| an - a1|)

    Ducci sequences either reach a tuple of zeros or fall into a periodic loop. For example, the 4-tuple sequence starting with 8,11,2,7 takes 5 steps to reach the zeros tuple:

     (8, 11, 2, 7) $displaystyle 
ightarrow$ (3, 9, 5, 1) $displaystyle 
ightarrow$ (6, 4, 4, 2) $displaystyle 
ightarrow$ (2, 0, 2, 4) $displaystyle 
ightarrow$ (2, 2, 2, 2) $displaystyle 
ightarrow$ (0, 0, 0, 0).

    The 5-tuple sequence starting with 4,2,0,2,0 enters a loop after 2 steps:

    (4, 2, 0, 2, 0) $displaystyle 
ightarrow$ (2, 2, 2, 2, 4) $displaystyle 
ightarrow$ ( 0, 0, 0, 2, 2$displaystyle 
ightarrow$ (0, 0, 2, 0, 2) $displaystyle 
ightarrow$ (0, 2, 2, 2, 2) $displaystyle 
ightarrow$ (2, 0, 0, 0, 2) $displaystyle 
ightarrow$(2, 0, 0, 2, 0) $displaystyle 
ightarrow$ (2, 0, 2, 2, 2) $displaystyle 
ightarrow$ (2, 2, 0, 0, 0) $displaystyle 
ightarrow$ (0, 2, 0, 0, 2) $displaystyle 
ightarrow$ (2, 2, 0, 2, 2) $displaystyle 
ightarrow$ (0, 2, 2, 0, 0) $displaystyle 
ightarrow$(2, 0, 2, 0, 0) $displaystyle 
ightarrow$ (2, 2, 2, 0, 2) $displaystyle 
ightarrow$ (0, 0, 2, 2, 0) $displaystyle 
ightarrow$ (0, 2, 0, 2, 0) $displaystyle 
ightarrow$ (2, 2, 2, 2, 0) $displaystyle 
ightarrow$ ( 0, 0, 0, 2, 2$displaystyle 
ightarrow$ ...

     Given an n-tuple of integers, write a program to decide if the sequence is reaching to a zeros tuple or a periodic loop.

    Input

    Your program is to read the input from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case starts with a line containing an integer n(3$ le$n$ le$15), which represents the size of a tuple in the Ducci sequences. In the following line, n integers are given which represents the n-tuple of integers. The range of integers are from 0 to 1,000. You may assume that the maximum number of steps of a Ducci sequence reaching zeros tuple or making a loop does not exceed 1,000.

    Output

    Your program is to write to standard output. Print exactly one line for each test case. Print `LOOP' if the Ducci sequence falls into a periodic loop, print `ZERO' if the Ducci sequence reaches to a zeros tuple.

    The following shows sample input and output for four test cases.

     Sample Input

    4 
    4 
    8 11 2 7 
    5 
    4 2 0 2 0 
    7 
    0 0 0 0 0 0 0 
    6 
    1 2 3 1 2 3

     Sample Output

    ZERO 
    LOOP 
    ZERO 
    LOOP

    题意分析:对一个数组不断按照以下过程进行变换(每个数变成后面一个元素与自身相减后取绝对值,最后一个数的下一个是第一个数):

    (a1, a2, · · · , an) → (|a1 − a2|, |a2 − a3|, · · · , |an − a1|)

    到最后要么变成全部为0(输出ZERO), 要么形成死循环(LOOP)。

    解决方法:因为数组元素个数最大才15,直接模拟,数组用vector记录,并用map记录每次变换后数组元素:

    map<vector<int>, int> mp;

    每次变换后查找map中是否已经存在,若已经存在则输出LOOP,结束。如果变换后结果是全部为0的数组,输出ZERO,结束。

    AC源码:

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <sstream>
     5 #include <map>
     6 using namespace std;
     7 
     8 map<vector<int>, int> mp;
     9 int myabs(int a)
    10 {
    11     return a>0?a:-a;
    12 }
    13 
    14 bool Zero(vector<int> &vec)
    15 {
    16     for(int i=0;i<vec.size();i++)
    17     {
    18         if(vec[i]!=0)
    19             return false;
    20     }
    21     return true;
    22 }
    23 
    24 void Change(vector<int>& vec)
    25 {
    26     int n = vec.size();
    27     int x = vec[0];
    28     for(int i=0;i<n-1;i++)
    29     {
    30         vec[i] = myabs(vec[i+1]-vec[i]);
    31     }
    32     vec[n-1] = myabs(vec[n-1]-x);
    33 }
    34 
    35 int main()
    36 {
    37 //    freopen("d:\data1.in","r",stdin);
    38     int cas;
    39     cin>>cas;
    40     while(cas--)
    41     {
    42         mp.clear();
    43         int i, n;
    44         vector<int> vec;
    45         cin>>n;
    46         for(i=0;i<n;i++)
    47         {
    48             int x;
    49             cin>>x;
    50             vec.push_back(x);
    51         }
    52         int flag = 0;
    53         while(true)
    54         {
    55             if(mp[vec])
    56             {
    57                 flag = 2;//loop
    58                 break;
    59             }
    60             mp[vec] = 1;
    61             if(Zero(vec))
    62             {
    63                 flag = 1;//zero
    64                 break;
    65             }
    66             Change(vec);
    67         }
    68         if(flag==1)
    69             cout<<"ZERO"<<endl;
    70         else if(flag==2)
    71             cout<<"LOOP"<<endl;
    72     } 
    73     return 0;
    74 }
  • 相关阅读:
    bootstrap 兼容 IE8
    在IE8的基础上安装IE11
    前台
    dll 库文件下载地址
    年轻
    linux 异常
    Navicat断网时连不上数据库
    jQuery
    破解版 Teamver 安装
    mysql
  • 原文地址:https://www.cnblogs.com/tzcacm/p/6846057.html
Copyright © 2011-2022 走看看