[R17C]投票分组2
前缀和解答, 话说 题目是真的绕啊
// [R17C]投票分组2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
题目地址:
https://bs.daimayuan.top/p/99
题目名称:
[R17C]投票分组2
题目描述:
班上有 n 名同学,同学的编号为 1∼n。
现在需要通过投票确定班服的款式,有款式 1 和款式 2 两个选项,已知同学 i 支持款式 a_i。
投票的规则为:
先将同学按编号每 k 个分为一组,要求 k 是 n 的因数,即同学 1∼k 为第 1 组,同学 k+1∼2×k 为第 2 组,以此类推;
每个同学投出一票支持款式 1 或者款式 2;
每个小组统计组内同学的投票情况,如果本小组中支持款式 1 的票多于支持款式 2 的票,那么视为整个小组支持款式 1。
对于 n 的每个因数 k,按 k 从小到大的顺序,分别求将同学按编号每 k 个分为一组后有多少个小组支持款式 1。
输入格式:
第一行包含一个整数 n,表示同学的数量。
第二行包含 n 个整数 a_i,分别表示每个同学支持哪个款式。
输出格式:
对于 n 的每个因数 k,按 k 从小到大的顺序,在单独的一行中输出一个整数,表示将同学按编号每 k 个分为一组后支持款式 1 的小组的数量。
数据范围:
对于 50% 的数据,n≤1000。
对于 100% 的数据,1≤n≤10^5,1≤a_i≤2。
样例输入:
12
1 2 2 1 1 2 1 1 2 2 1 2
样例输出:
6
1
2
1
0
0
样例解释:
如果每个小组 1 个同学,共有 12 个小组,其中有 6 个小组支持款式 1:1,4,5,7,8,11。
如果每个小组 2 个同学,共有 6 个小组,其中有 1 个小组支持款式 1:4。
如果每个小组 3 个同学,共有 4 个小组,其中有 2 个小组支持款式 1:2,3。
如果每个小组 4 个同学,共有 3 个小组,其中有 1 个小组支持款式 1:2。
如果每个小组 6 个同学,共有 2 个小组,其中有 0 个小组支持款式 1。
如果每个小组 12 个同学,共有 1 个小组,其中有 0 个小组支持款式 1。
*/
#include <iostream>
using namespace std;
const int N = 100010;
int pre[N]; //前缀和记录到i为止 支持1款式的同学数目
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
int t; cin >> t;
pre[i] = pre[i - 1] + 1 * (t == 1);
}
for (int i = 1; i <= n; i++) {
if (n % i != 0) continue;
int len = i; int res = 0;
for (int l = 1; l <= n; l += len) {
int r = l + len-1;
//lr范围内支持1 的同学数目
int cnt = pre[r] - pre[l - 1];
if (cnt * 2 > len) { res++; }
}
cout << res << endl;
}
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力

