标签:范围 mem pac mes -- 就是 元素 链接 一个
题目链接:https://vjudge.net/contest/436484#problem/E
题目的大致意思就是给俩数,分别是小数组的大小N和数目K,给的数组是递增的,方便后续的判断,将大数组分成K个小数组,数组的元素自己决定,但是要得到小数组的最大中位数和。
题意挺好理解的,接下来就是写程序了:
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long a[200005]={0}; 4 int main(){ 5 long long t,n,m,sum,x; 6 cin>>t; 7 while(t--){ 8 cin>>n>>m; 9 sum=0; 10 for(int i=1;i<=n*m;i++) cin>>a[i]; 11 x=(n+1)/2; 12 if(x==1) for(int i=1;i<=n*m;i+=n) sum+=a[i]; 13 else for(int i=n*m-(n-x),j=0;j<m;i-=(n-x+1),j++){ 14 sum+=a[i]; 15 // printf("%lld ",a[i]); 16 } 17 cout<<sum<<endl; 18 memset(a,0,sizeof a); 19 } 20 return 0; 21 }
这个代码挺好理解的,就自己看那个样例就能找到规律
就比如说,当N=2或者1的时候,因为中位数都是小数组的第一个,就直接遍历一遍大数组就行;N等于其他值的时候可以发现要求中位数尽量大的话,就得让中位数之前的数字选在大数组的前面,中位数以及后面的数字从大数组后面开始选择,思路理清楚了,代码就好写了,不过得注意数组的值是刚好在int 范围内,中值就不仅仅在int 范围了,记得开long long来存就OK。
标签:范围 mem pac mes -- 就是 元素 链接 一个
原文地址:https://www.cnblogs.com/zm-23/p/14725866.html