[題解]Codeforces Round #519 - B. Lost Array

【題目】ios

B. Lost Array數組

【描述】ide

Bajtek有一個數組x[0],x[1],...,x[k-1]但被搞丟了,但他知道另外一個n+1長的數組a,有a[0]=0,對i=1,2,...,n。由此能夠找到數組x[0],x[1],...,x[k-1]的一些可能狀況,即知足這個關係的數組x[0],x[1],...,x[k-1]。問一共有多少種可能的數組x[0],x[1],...,x[k-1]的長度k,輸出可能的數量以及全部可能的長度k。spa

數據範圍:1<=n<=1000,1<=a[i]<=10^6(這裏不包括a[0],默認a[0]=0)code

【思路】blog

 先不考慮數組x是循環的,即不考慮數組x是有限長的,那麼由數組a能夠反解出與數組a等長的一個數組「x」,咱們要找的真正的數組x其實是這個反解出來的「x」的一個週期,咱們要找的就是這個「x」有多少種週期長度。get

要驗證i是否是「x」的一個週期長度,則將「x」的元素分爲i組,即下標模i相同的分到一組,檢查每一組從前日後數第某個元素是否是都是相同的。這裏複雜度是O(n)的。string

對i進行枚舉,便可找到全部可能的週期長度。至此複雜度爲O(n^2)。it

【個人實現】io

 複雜度:O(n^2)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 #define MaxN 1020
 8 int x[MaxN];
 9 int Ans[MaxN];
10 
11 int main()
12 {
13     int n;
14     int a, pre_a = 0;
15     int i, j, k;
16     //int cur;
17     bool flag;
18     scanf("%d", &n);
19     for(i = 1; i <= n; i++)
20     {
21         scanf("%d", &a);
22         x[i-1] = a - pre_a;
23         pre_a = a;
24     }
25     for(i = 1; i <= n; i++) //step = i
26     {
27         flag = false;
28         for(j = 0; j < i; j++) //start at j for each zhouqi
29         {
30             for(k = j; k < n; k += i)
31             {
32                 if(k > j && x[k] != x[k-i])
33                 {
34                     flag = true;
35                     break;
36                 }
37             }
38             if(flag)
39                 break;
40         }
41         if(!flag)
42             Ans[++Ans[0]] = i;
43     }
44     printf("%d\n", Ans[0]);
45     for(i = 1; i <= Ans[0]; i++)
46         printf("%d ", Ans[i]);
47     return 0;
48 }
View Code

【評測結果】

 

相關文章
相關標籤/搜索