0
点赞
收藏
分享

微信扫一扫

【代码源 Div1 - 106】#456. 选数(抽屉原理) POJ2356


problem

【代码源 Div1 - 106】#456. 选数(抽屉原理) POJ2356_算法

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;
}


举报

相关推荐

0 条评论