iOS中取数组的最大值、最小值,下标,总和,平均值


标签: ios数组nsarrayindex

代码不多,其中采用了三目运算法对数据进行对比,如果有需要的话,自己把这个方法拆分,最小值不拆分有误差

这里是需要下标,直接上代码:

  1. </pre><p class="p1"><pre name="code" class="objc">    NSArray * ary = @[@"45",@"876",@"234",@"98",@"23",@"63",@"34",@"4"];  
  2.     int max_number = 0;          //最大值  
  3.     int max_index = 0;           //最大值的下标  
  4.       
  5.     int min_number = INFINITY;   //最小值  
  6.     int min_index = 0;           //最小值下标  
  7.       
  8.     int all = 0;                 //总和  
  9.     float mid = 0;                //总和平均值  
  10.       
  11.     for (int i=0; i<ary.count; i++)  
  12.     {  
  13.         //取最大值和最大值的对应下标  
  14.         int a = [ary[i] intValue];  
  15.         if (a>max_number)  
  16.         {  
  17.             max_index=i;  
  18.         }  
  19.         max_number = a>max_number?a:max_number;  
  20.           
  21.         //取最小值和最小值对应的下标  
  22.         int b = [ary[i] intValue];  
  23.         if (b<min_number)  
  24.         {  
  25.             min_index = i;  
  26.         }  
  27.         min_number = b>min_number?min_number:b;  
  28.           
  29.         //去除数组中所有的值  
  30.         int c = [ary[i] intValue];  
  31.         all = all+c;  
  32.           
  33.         //求平均数  
  34.         mid = all/ary.count;  
  35.     }  
  36.     NSLog(@"输出最大值在数组中的下标---->>>%d",max_index);  
  37.     NSLog(@"输出数组中最大值---->>>>%d",max_number);  
  38.       
  39.     NSLog(@"输出最小值在数组中的下标---->>>%d",min_index);  
  40.     NSLog(@"输出数组中最小值---->>>>%d",min_number);  
  41.       
  42.     NSLog(@"输出所有的元素的和---->>>%d",all);  
  43.       
  44.     NSLog(@"输出数组内所有数据的平均数--->>>%.2f",mid);    // 考虑到不一定是刚好可以整除,所以取保留小数点后两位  
  45.       
</pre><p class="p1"><pre name="code" class="objc">    NSArray * ary = @[@"45",@"876",@"234",@"98",@"23",@"63",@"34",@"4"];
    int max_number = 0;          //最大值
    int max_index = 0;           //最大值的下标
    
    int min_number = INFINITY;   //最小值
    int min_index = 0;           //最小值下标
    
    int all = 0;                 //总和
    float mid = 0;                //总和平均值
    
    for (int i=0; i<ary.count; i++)
    {
        //取最大值和最大值的对应下标
        int a = [ary[i] intValue];
        if (a>max_number)
        {
            max_index=i;
        }
        max_number = a>max_number?a:max_number;
        
        //取最小值和最小值对应的下标
        int b = [ary[i] intValue];
        if (b<min_number)
        {
            min_index = i;
        }
        min_number = b>min_number?min_number:b;
        
        //去除数组中所有的值
        int c = [ary[i] intValue];
        all = all+c;
        
        //求平均数
        mid = all/ary.count;
    }
    NSLog(@"输出最大值在数组中的下标---->>>%d",max_index);
    NSLog(@"输出数组中最大值---->>>>%d",max_number);
    
    NSLog(@"输出最小值在数组中的下标---->>>%d",min_index);
    NSLog(@"输出数组中最小值---->>>>%d",min_number);
    
    NSLog(@"输出所有的元素的和---->>>%d",all);
    
    NSLog(@"输出数组内所有数据的平均数--->>>%.2f",mid);    // 考虑到不一定是刚好可以整除,所以取保留小数点后两位
    


如果不需要下标的话可以采用这一段代码

上代码喽:

  1. CGFloat all_value = [[ary valueForKeyPath:@"@sum.floatValue"] floatValue];  //总和  
  2. CGFloat mid_value = [[ary valueForKeyPath:@"@avg.floatValue"] floatValue];  //平均数  
  3. CGFloat max_value = [[ary valueForKeyPath:@"@max.floatValue"] floatValue];  //最大值  
  4. CGFloat min_value = [[ary valueForKeyPath:@"@min.floatValue"] floatValue];  //最小值  
  5.   
  6.   
  7. NSLog(@"总值--->>>%.2f\n平均值--->>>%.2f\n最大值---->>>>%.2f\n最小值---->>>%.2f",all_value,mid_value,max_value,min_value);  
    CGFloat all_value = [[ary valueForKeyPath:@"@sum.floatValue"] floatValue];  //总和
    CGFloat mid_value = [[ary valueForKeyPath:@"@avg.floatValue"] floatValue];  //平均数
    CGFloat max_value = [[ary valueForKeyPath:@"@max.floatValue"] floatValue];  //最大值
    CGFloat min_value = [[ary valueForKeyPath:@"@min.floatValue"] floatValue];  //最小值
    
    
    NSLog(@"总值--->>>%.2f\n平均值--->>>%.2f\n最大值---->>>>%.2f\n最小值---->>>%.2f",all_value,mid_value,max_value,min_value);
    


# CF2126G2 Big Wins! (hard version) ## 题目描述 这是该问题的困难版本。不同之处在于本版本中 $a_i \leq n$。 给定一个长度为 $n$ 的整数数组 $a_1, a_2, \dots, a_n$。 你的任务是找到一个子数组 $a[l, r]$(即一段连续的元素 $a_l, a_{l + 1}, \dots, a_r$),使得表达式 $\text{med}(a[l, r]) - \min(a[l, r])$ 的值最大。 其中: - $\text{med}$ 表示子数组的中位数,即将子数组排序后,第 $\left\lceil \frac{k + 1}{2} \right\rceil$ 个元素,$k$ 为子数组长度; - $\min$ 表示该子数组中的最小元素。 例如,考虑数组 $a=[1, 4, 1, 5, 3, 3]$,选择子数组 $a[2, 5] = [4, 1, 5, 3]$。排序后为 $[1, 3, 4, 5]$。 - $\text{med}(a[2, 5]) = 4$,因为 $\left\lceil \frac{4 + 1}{2} \right\rceil = 3$,排序后第 3 个元素为 $4$; - $\min(a[2, 5]) = 1$,因为最小元素为 $1$。 在本例中,$\text{med} - \min = 4 - 1 = 3$。 ## 输入格式 第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。 每个测试用例的第一行包含一个整数 $n$($1 \leq n \leq 2 \cdot 10^5$),表示数组的长度。 每个测试用例的第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($1 \leq a_i \leq n$),表示数组元素。 保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。 ## 输出格式 对于每个测试用例,输出一个整数,表示所有子数组中 $\text{med} - \min$ 的最大可能值。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 5 3 2 5 3 1 4 4 1 1 3 7 6 1 3 4 6 2 7 4 4 2 3 1 5 1 2 3 4 5 ``` ### 输出 #1 ``` 3 3 5 2 2 ``` ## 说明/提示 在第一个示例中,考虑数组 $a=[3,\ 2,\ 5,\ 3,\ 1]$,可以选择子数组 $a[2,\ 3]$,即元素 $[2,\ 5]$。 - 子数组长度为 $2$。 - 中位数为排序后第 $\left\lceil \dfrac{3}{2} \right\rceil = 2$ 个元素。排序后为 $[2,\ 5]$,$\text{med} = 5$。 - 子数组的最小元素为 $2$。 因此,$\text{med} - \min = 5 - 2 = 3$,这是最大答案。 在第二个测试用例中,数组 $a=[4,\ 1,\ 1,\ 3]$,可以选择子数组 $a[1,\ 2]$,即元素 $[4,\ 1]$。 - 子数组长度为 $2$。 - 中位数为排序后第 $\left\lceil \dfrac{3}{2} \right\rceil = 2$ 个元素。排序后为 $[1,\ 4]$,$\text{med} = 4$。 - 子数组的最小元素为 $1$。 因此,$\text{med} - \min = 4 - 1 = 3$。 可以证明,这两个子数组都是最优的,能够得到表达式 $\text{med} - \min$ 的最大值。 由 ChatGPT 4.1 翻译 //https://blog.youkuaiyun.com/ez_gsn/article/details/124840464?ops_request_misc=elastic_search_misc&request_id=743433b74cd2da2925edc4e1cc7af925&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~ElasticSearch~search_v2-1-124840464-null-null.142^v102^pc_search_result_base9&utm_term=P2839%20%5B%E5%9B%BD%E5%AE%B6%E9%9B%86%E8%AE%AD%E9%98%9F%5D%20middle #include<bits/stdc++.h> #define int long long using namespace std; int n; int a[20005]; int b[20005]; int sl; vector<int> pos[20005]; int cnt; int rt[20005]; struct TREE { int l,r; int sum;//区间和 int lml,rml;//最大前缀和,最大后缀和 } tr[20005*40]; void pushup(int x) { tr[x].sum=tr[tr[x].l].sum+tr[tr[x].r].sum; tr[x].lml=max(tr[tr[x].l].lml,tr[tr[x].l].sum+tr[tr[x].r].lml); tr[x].rml=max(tr[tr[x].r].rml,tr[tr[x].r].sum+tr[tr[x].l].rml); } int build(int i,int l,int r) { i=++cnt; if(l==r) { tr[i].sum=tr[i].lml=tr[i].rml=1; //初始线段树对应最小中位数候选值(mid = num[1]), //此时所有元素都 ≥ mid,因此每个位置都是 1。 return i; } int mid=(l+r)/2; tr[i].l=build(tr[i].l,l,mid); tr[i].r=build(tr[i].r,mid+1,r); pushup(i); return i; } int update(int x,int y,int ps,int l,int r) { //单点修改 //f:是否需要新建节点 0:需要 1:不需要 //x:当前新版本的节点索引(需修改的节点) //y:旧版本的对应节点索引(数据来源) x=++cnt; if(l==r) { tr[x].lml=tr[x].rml=tr[x].sum=1; return x; } tr[x]=tr[y]; int mid=(l+r)/2; if(ps<=mid) tr[x].l=update(tr[x].l,tr[y].l,ps,l,mid); else tr[x].r=update(tr[x].r,tr[y].r,ps,mid+1,r); pushup(x); return x; } int query_sum(int i,int l,int r,int qry_l,int qry_r) { //区间和 if(i==0) return 0; if(l>=qry_l&&r<=qry_r) return tr[i].sum; int ans=0,mid=(l+r)/2; if(mid>=qry_l) ans+=query_sum(tr[i].l,l,mid,qry_l,qry_r); if(mid<qry_r) ans+=query_sum(tr[i].r,mid+1,r,qry_l,qry_r); return ans; } TREE query_lml(int i,int l,int r,int qry_l,int qry_r) { //在区间 [qry_l, qry_r] 内部,从 qry_l 开始计算的最大前缀和 if(i==0) return {0,0,0,0,0}; if(l>=qry_l&&r<=qry_r) return tr[i]; int mid=(l+r)/2; if(qry_l<=mid&&qry_r>mid) { //qry_r>r 不能去等,保证右子树不为空 TREE ls,rs; ls=query_lml(tr[i].l,l,mid,qry_l,qry_r); rs=query_lml(tr[i].r,mid+1,r,qry_l,qry_r); TREE ans; ans.sum=ls.sum+rs.sum; ans.lml=max(ls.sum+rs.lml,ls.lml); return ans; } if(qry_l<mid) return query_lml(tr[i].l,l,mid,qry_l,qry_r); else return query_lml(tr[i].r,mid+1,r,qry_l,qry_r); } TREE query_rml(int i,int l,int r,int qry_l,int qry_r) { //在区间 [qry_l, qry_r] 内部,从 qry_l 开始计算的最大前缀和 if(i==0) return {0,0,0,0,0}; if(l>=qry_l&&r<=qry_r) return tr[i]; int mid=(l+r)/2; if(qry_l<=mid&&qry_r>mid) { //qry_r>r 不能去等,保证右子树不为空 TREE ls,rs; ls=query_rml(tr[i].l,l,mid,qry_l,qry_r); rs=query_rml(tr[i].r,mid+1,r,qry_l,qry_r); TREE ans; ans.sum=ls.sum+rs.sum; ans.rml=max(rs.sum+ls.rml,rs.rml); return ans; } if(qry_l<mid) return query_rml(tr[i].l,l,mid,qry_l,qry_r); else return query_rml(tr[i].r,mid+1,r,qry_l,qry_r); } bool cmp(int x,int y) { return a[x]>a[y]; } stack<int> s; int f[20005];//表示位置 i 左边第一个小于 a[i] 的元素的位置 int g[20005];//表示位置 i 右边第一个小于 a[i] 的元素的位置。 main() { // ios::sync_with_stdio(0); // cin.tie(0); // cout.tie(0); int T; cin>>T; while(T--) { int n; cin>>n; for(int i=1; i<=n; i++) cin>>a[i],b[i]=i; sort(b+1,b+1+n,cmp); rt[0]=build(rt[0],1,n); for(int i=1; i<=n; i++) rt[i]=update(rt[i],rt[i-1],b[i],1,n); while(!s.empty()) s.pop(); for (int i = 1; i <= n; i++) f[i] = 0, g[i] = n + 1; for (int i = 1; i <= n; i++) { while (s.size() && a[i] < a[s.top()]) g[s.top()] = i, s.pop(); if (s.size()) f[i] = s.top(); s.push(i); } int ans = 0; for (int i = 1; i <= n; i++) { int x = f[i] + 1, y = g[i] - 1; int l = 1, r = n; while (l < r) { int mid = (l + r) >> 1; int X = query_rml(rt[mid], 1, n, x, i).rml; int Y = -query_sum(rt[mid], 1, n, i, i); int Z = query_lml(rt[mid], 1, n, i, y).lml; if (X + Y + Z >= 0) r = mid; else l = mid + 1; } ans = max(ans, a[b[l]] - a[i]); } cout << ans << '\n'; } } 代码问题
最新发布
08-26
Problem C: 糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。 Input 输入的第一行是两个整数N,K。 接下来K行,表示这些点需要满足的关系,每行3个数字,X,A,B。 如果X=1, 表示第A个小朋友分到的糖果必须和第B个小朋友分到的糖果一样多; 如果X=2, 表示第A个小朋友分到的糖果必须少于第B个小朋友分到的糖果; 如果X=3, 表示第A个小朋友分到的糖果必须不少于第B个小朋友分到的糖果; 如果X=4, 表示第A个小朋友分到的糖果必须多于第B个小朋友分到的糖果; 如果X=5, 表示第A个小朋友分到的糖果必须不多于第B个小朋友分到的糖果; Output 输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。 Sample Input 5 7 1 1 2 2 3 2 4 4 1 3 4 5 5 4 5 2 3 5 4 5 1 Sample Output 11 HINT 【数据范围】 对于30%的数据,保证 N<=100 对于100%的数据,保证 N<=100000 对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N C++
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值