UVA1594 Ducci Sequence 【模拟】

题目链接:https://vjudge.net/problem/UVA-1594

题意:

对于一个n元组(a1, a2, … , an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的 n 元组 (|a1-a2|, |a2-a3|, … , |an-a1|)。重复这个过程,得到的序列称之为 Ducci 序列。求Ducci数列如果在1000步以内循环了,就输出 LOOP,否则输出 ZERO

题解:

按照题意的方式求出 每个 n 元组,如果步数 >= 1000而还是没有出现全0,则应输出 LOOP(因为题目保证如果出现全0的话是在1000步以内。),否则输出ZERO,注意到 n <= 15,这样的数据运行起来绰绰有余。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <ctype.h>//isalpha,isdight,toupper
#include <map>
#include <sstream>
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=20+5;
int a[maxn],b[maxn];
int main(){
    int t,n;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        int fg=1;
        for(int cnt=0;;cnt++){
                if(cnt>=1000){
                    fg=0;
                    break;
                }
                for(int i=1;i<n;i++){
                    b[i-1]=abs(b[i]-b[i-1]);
                }
                b[n-1]=abs(a[n-1]-a[0]);
                bool zero =1;
                for(int i=0;i<n;i++){
                    if(b[i]!=0)zero=0;
                    a[i]=b[i];
                }
                if(zero)break;
        }
        if(fg)puts("ZERO");
        else puts("LOOP");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/abc1235454/article/details/88956292
今日推荐