题解

4 条题解

  • 0
    @ 2019-07-29 21:13:32

    枚举吧,第i位到第j位之和。

    #include <iostream>
    
    using namespace std;
    
    int n;
    int a[5001]={0};
    int dp[5001];
    
    int main()
    {
        cin>>n;
        int i,j;
        for(i=1;i<=n;i++)
        {
            cin>>j;
            j=j%n;
            a[i]=j;
        }
        for(j=1;j<=n;j++)
        {
            for(i=j;i>=1;i--)
            {
                if(i==j)
                {
                    dp[i]=a[j];
                }
                else
                {
                    dp[i]=(dp[i]+a[j])%n;
                }
                if(dp[i]==0)
                {
                    goto pend;
                }
            }
        }
    pend:
        cout<<j-i+1<<endl;
        for(;i<=j;i++)
        {
            cout<<i<<endl;
        }
        return 0;
    }
    
  • -2
    @ 2018-04-20 22:23:33
    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 5010;
    int n, sum[maxn];
    
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> sum[i];
            sum[i] += sum[i - 1];
        }
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j <= n; j++) {
                if ((sum[j] - sum[i]) % n == 0) {
                    printf("%d\n", j - i);
                    for (int k = i + 1; k <= j; k++) {
                        printf("%d ", k);
                    }
                    return 0;
                }
            }
        }
        return 0;
    }
    
  • -3
    @ 2018-12-22 19:17:53

    这道题数据非常水,随机生成一些子集,直到生成出来一个和为n的子集就可以了。
    原因是每次生成子集,子集和是n的倍数的几率都是1/n,每次随机生成一个子集O(n)次操作,平均需要生成O(n)个子集,所以总期望时间复杂度O(n^2)。

    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    int n;
    
    int a[5005];
    
    int chosen[5005];
    
    unsigned int cur = 123456789;
    
    unsigned int random_gen(void)
    {
        cur ^= cur << 5;
        cur ^= cur >> 7;
        return cur;
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", a + i);
        }
        while (1) {
            bool good = false;
            int sum = 0;
            int m = 0;
            for (int i = 1; i <= n; i++) {
                chosen[i] = random_gen() % 2;
                good = good || chosen[i];
                sum += a[i] * chosen[i];
                m += chosen[i];
            }
            if (!good) continue;
            if (sum % n == 0) {
                printf("%d\n", m);
                for (int i = 1; i <= n; i++) {
                    if (chosen[i]) {
                        printf("%d ", i);
                    }
                }
                return 0;
            }
        }
    }
    
    
    
  • -3
    @ 2018-04-21 21:52:37

    怎么说呢。。。只能说数据水吧
    看到这个题很容易想到用一道关于完全剩余系的,通过前缀和很容易就可以实现
    但是这些数并不一定是连续排列的,所以按理讲这样过不了。。。
    但就是过了。。
    可能真的是数据水

    • @ 2018-05-06 22:34:31

      @猫粮寸断

      什么意思啊?

      那么我的代码是对的吗?我的思路可以通过抽屉原理证明。

  • 1

信息

ID
2038
难度
3
分类
(无)
标签
(无)
递交数
54
已通过
13
通过率
24%
被复制
2
上传者