4 条题解
-
0Lifi LV 10 @ 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; }
-
-22018-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; }
-
-32018-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; } } }
-
-32018-04-21 21:52:37@
怎么说呢。。。只能说数据水吧
看到这个题很容易想到用一道关于完全剩余系的,通过前缀和很容易就可以实现
但是这些数并不一定是连续排列的,所以按理讲这样过不了。。。
但就是过了。。
可能真的是数据水
- 1
信息
- ID
- 2038
- 难度
- 3
- 分类
- (无)
- 标签
- (无)
- 递交数
- 54
- 已通过
- 13
- 通过率
- 24%
- 被复制
- 2
- 上传者