【题集】k倍区间(抽屉原理)
例1:http://lx.lanqiao.cn/problem.page?gpid=T444
你能求出数列中总共有多少个K倍区间吗?
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 100000 + 10;
int sum[MAXN];
int cnt[MAXN];
int main(){
int N, K;
scanf("%d%d", &N, &K);
for(int i = 0; i < N; ++i){
scanf("%d", &sum[i]);
}
sum[0] %= K;
for(int i = 1; i < N; ++i){
sum[i] = ((sum[i] % K) + sum[i - 1]) % K;
}
LL ans = 0;
for(int i = 0; i < N; ++i){
ans += cnt[sum[i]]++;
}
printf("%lld\n", ans + cnt[0]);
return 0;
}
例2:https://cn.vjudge.net/problem/POJ-3370
题意:每个邻居可以给ai个糖,共n个邻居,问向哪几个邻居要糖可以正好被c个孩子平分。
分析:此题和例1解法相似。
若sum[i] % c == 0,则[1, i]可以被c整除;
若sum[l - 1] % c == sum[r] % c,则[l, r]可以被c整除;
由于输出任意一种答案即可,那会不会存在一种可能,就是答案都不是连续的区间,而是不连续的区间呢?
由于本题中c<=n,因此一定存在连续区间的解。
原因在于,
若sum[i]能被c整除,一定存在连续区间的解[1, i];
若sum[i]不能被c整除,则sum[i]%c可能的结果在[1, c-1]里,共c-1种可能,而c-1<n,根据抽屉原理,因此一定存在一对i, j,使得sum[i] % c == sum[j] % c,即存在连续区间解[i + 1, j].
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN = 100000 + 10;
int sum[MAXN];
int id[MAXN];
int main(){
int c, n;
while(scanf("%d%d", &c, &n) == 2){
if(!c && !n) return 0;
memset(sum, 0, sizeof sum);
memset(id, 0, sizeof id);
for(int i = 1; i <= n; ++i){
scanf("%d", &sum[i]);
}
sum[1] %= c;
for(int i = 2; i <= n; ++i){
sum[i] = ((sum[i] % c) + sum[i - 1]) % c;
}
int st, et;
for(int i = 1; i <= n; ++i){
if(sum[i] == 0){
st = 1;
et = i;
break;
}
if(id[sum[i]]){
st = id[sum[i]] + 1;
et = i;
break;
}
id[sum[i]] = i;
}
for(int i = st; i <= et; ++i){
printf("%d", i);
if(i == et) printf("\n");
else printf(" ");
}
}
return 0;
}
例3:https://cn.vjudge.net/problem/POJ-2356
分析:与例2相似,因为N-1 < N,所以一定存在连续区间的解。
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN = 15000 + 10;
int a[MAXN];
int sum[MAXN];
int id[MAXN];
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
}
sum[1] = a[1] % n;
for(int i = 2; i <= n; ++i){
sum[i] = ((a[i] % n) + sum[i - 1]) % n;
}
int st, et;
for(int i = 1; i <= n; ++i){
if(sum[i] == 0){
st = 1;
et = i;
break;
}
if(id[sum[i]]){
st = id[sum[i]] + 1;
et = i;
break;
}
id[sum[i]] = i;
}
printf("%d\n", et - st + 1);
for(int i = st; i <= et; ++i){
printf("%d\n", a[i]);
}
return 0;
}
【题集】k倍区间(抽屉原理)的更多相关文章
- 2017蓝桥杯第十题(k倍区间)
#include<iostream> #include<stdio.h> using namespace std; ; ],a[N]; int lowbit(int n){ r ...
- 第八届蓝桥杯省赛 K倍区间
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 蓝桥杯-k倍区间
http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...
- k倍区间:前缀和
[蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...
- k倍区间(解题报告)前缀和简单应用
测评地址 问题 1882: [蓝桥杯][2017年第八届真题]k倍区间 时间限制: 1Sec 内存限制: 128MB 提交: 351 解决: 78 题目描述 给定一个长度为N的数列,A1, A2, . ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 蓝桥杯试题 k倍区间(dp)
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- k倍区间
看大佬的代码看了半天,终于算是懂了 标题: k倍区间 给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就 ...
- k倍区间 前缀和【蓝桥杯2017 C/C++ B组】
标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
随机推荐
- Java中的基本数据类型语法补充
变量要先赋值后使用 不给变量赋值代表什么 不赋值就使用会怎样 (会报错) 计算并赋值运算符 作用是为了让代码更加简洁.比如 a = a + 10,可以简化为 a+=10 += -= *= /= %= ...
- 2.9 logistic回归中的梯度下降法(非常重要,一定要重点理解)
怎么样计算偏导数来实现logistic回归的梯度下降法 它的核心关键点是其中的几个重要公式用来实现logistic回归的梯度下降法 接下来开始学习logistic回归的梯度下降法 logistic回归 ...
- 笔记-python-lib—data types-enum
笔记-python-lib—data types-enum 1. enum Source code: Lib/enum.py 文档:https://docs.python.org/3/lib ...
- Android开发之显示分辨率及单位
Android 各种屏幕分辨率: VGA: Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA: Half-size VGA ...
- 该怎样应对IoT和边缘计算安全挑战
导读 虽然智能家居的响应延迟似乎不是大问题,但如果自动驾驶汽车需要刹车,而数据出现延迟或者被黑客拦截或操纵,这可能造成灾难性后果.这里将需要边缘计算安全. 边缘计算可在靠近远程设备的位置提供计算.存储 ...
- 【PAT甲级】1029 Median (25 分)
题意: 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数. 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数.(重复一次) 输出两组数合并后的中位数.(200ms, ...
- Linux centosVMware Nginx安装、 默认虚拟主机、Nginx用户认证、Nginx域名重定向
一. Nginx安装 cd /usr/local/src wget http://nginx.org/download/nginx-1.12.1.tar.gz 版本在http://nginx.org/ ...
- VMware 设置共享文件夹
1. 打开: 虚拟机 -> 设置 -> 选项 2. 选择 “总是启用” ,然后点 “添加” 选择你要共享的本地文件夹,最后点确定. 3. Linux下在 /mnt/hgfs 文件夹下就可以 ...
- ES6 && ECMAScript2015 新特性
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES201 ...
- PL-USB2-BLASTER 使用说明
PL-USB2-BLASTER 使用说明 PL-USB2-BLASTER就是USB BLATER II烧录器.官方文档在https://www.intel.com/content/dam/www/pr ...