代码源 Div1 - 106#456. 选数(抽屉原理) POJ2356
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码源 Div1 - 106#456. 选数(抽屉原理) POJ2356相关的知识,希望对你有一定的参考价值。
problem
solution
原本以为是01背包,但只能求出是否有解,没法求解- 对原数组求取模后的前缀和 sum ,则对于sum数组中的每个数,均位于[0,n - 1],共 n 种取值,而 sum[0 ~ n] 有n + 1 个数。
- 根据抽屉原理,必定至少存在两个取值相同的数,设为l ,r,也就是说,sum[l] = sum[r],区间[l + 1,r]的和为零,就是答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int s[maxn];
int main()
int n; cin>>n;
for(int i = 1; i <= n; i++)
int x; cin>>x;
s[i] = (s[i-1]+x)%n;
int l, r;
map<int,int>ma;
for(int i = 0; i <= n; i++)
if(!ma.count(s[i]))ma[s[i]] = i;
else
l = ma[s[i]]+1; r = i;
break;
cout<<r-l+1<<"\\n";
for(int i = l; i <= r; i++)cout<<i<<" ";
return 0;
以上是关于代码源 Div1 - 106#456. 选数(抽屉原理) POJ2356的主要内容,如果未能解决你的问题,请参考以下文章
代码源 Div1 - 105#451. Dis(倍增求LCA)