题解 | #井然有序之衡#

井然有序之衡

https://ac.nowcoder.com/acm/contest/95323/G


题意: 小红拿到了一个数组,她可以进行任意次以下操作:选择两个元素,使得其中一个加 1,另一个减 1。小红希望最终数组变成一个排列如果无法生成排列,直接输出 -1;否则,求最小的操作次数。(长度为 n排列是由 1∼nn个整数、按任意顺序组成的数组,其中每个整数恰好出现一次。)

输入描述:第一行输入一个整数 n( 1 ≤ n ≤ 10^5 )代表数组中的元素数量。第二行输入 n 个整数 a1,a2,…,an ( −10^9 ≤ ai ≤ 10^9 ) 代表数组元素。


法1:如果能变成数列,则数组和=数列和;求操作次数,先排序,每个数-序号的值的绝对值和 是操作数的两倍
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, ns[100011];   /*ns存数*/
    long long sum1=0,sum2=0,sum3=0;    /*sum1是排列的总和,sum2是数组的总和,sum3是操作次数*/
     //特别注意:一直卡着不过的原因是 忽视了和的大小会超过10的9次方!!!
    
    scanf("%d",&n);
    for(int i=1;i<n+1;i++){        /*输入数,并求和*/
        scanf("%d",&ns[i]);
        sum1=sum1+i;
        sum2=sum2+ns[i];
    }
      
    if(sum1==sum2){       /*排序,并求操作次数*/
        sort(ns+1,ns+n+1);
        
       /*原操作有误,每个数都可能大于或小于i 
       for(int i=1;i>ns[i];i++){
            sum3=sum3+i-ns[i];
        }*/
        
       for(int i = 1;i <= n;i++){
         if(i < ns[i])sum3 = sum3 + ns[i] - i;
        }
       cout << sum3;
    }
    else{
        cout << "-1";
    }
      
    return 0;
}
教训:
1,做题先看数据范围!!还要看如果求和,和是否超出范围 ! ! !





全部评论

相关推荐

头像
08-05 15:59
已编辑
门头沟学院 运维工程师
点赞 评论 收藏
分享
牛马为难牛马中,疑似阿里的员工看某个从拼多多跳槽过来的员工抢他的A+绩效不顺眼,反手向多多举报的,结果导致人家竞业被发现了,违约金5w,赔偿100+w上海长宁区劳动人事争议仲裁委公告显示:上海寻梦信息技术有限公司(拼多多主体)与一名员工的劳动争议案,因被申请人未到庭,仲裁委依法缺席裁决。结果是,该员工需要返还已发放的竞业补偿58,211.29元,并按约支付违约金1,089,103元。公告自发布30日后视为送达,15日内不诉即生效
nova!1028:竞业避坑指南:1、平时戴口罩及帽子、墨镜,不在公共场所露面 2、不在现有公司收快递 3、自己竞业期间社保缴纳不挂靠,最好不交 4、三方公司不能对外说可挂医社保 5、记住社保缴纳地的地址 6、注意陌生可疑电话,比如猎头 7、自己名下车子不要出入到服务的场所 8、竞业到期后不能马上出现在竞对公司股东信息上 9、注意平台简历内容,会被取证 10、竞业期过后,不要透露过往,以防被追溯 11、非必要不开大会和培训,注意公司内鬼 12、不在社交平台展示自己 13、电话卡不用自己名字登记 14、注意陌生的外卖 15、注意动车票信息 16、竞业期低调不结仇 复制过来的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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