第一题,代码。因为改了两个版本。所以有点丑。 思路:先求sum[i],表示前i项的和,然后对每个sum[i]模k,那么我们要找的就是模k后的值相同的那些数中相距最远的。 #include <iostream> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; bool cmp(const pair<int,int>& a,const pair<int,int>&b){ if(a.first==b.first){ return a.second < b.second; }else{ return a.first<b.first; } } int main(){ int n; cin>>n; vector<int> a(n+1); vector<int> s(n+1,0); for(int i=1;i<=n;++i){ cin>>a[i]; s[i] = s[i-1] + a[i]; } int k; cin>>k; int res = 0; vector<pair<int,int>> mod(n+1); for(int i=1;i<=n;++i){ mod[i].first = s[i]%k; mod[i].second = i; } sort(mod.begin()+1,mod.end(),cmp); int l = 0; int tem = 0; for(int i=1;i<=n;++i){ if(mod[i].first==tem) continue; else { int tres = mod[i-1].second - mod[l].second; res = max(res,tres); tem = mod[i].first; l = i; } } int tres = mod[n].second - mod[l].second; res = max(res,tres); cout<<res<<endl; }
点赞 10

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务