题解 | #井然有序之衡#

井然有序之衡

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,做题先看数据范围!!还要看如果求和,和是否超出范围 ! ! !





全部评论

相关推荐

扉川川:查看图片
投递用友等公司10个岗位
点赞 评论 收藏
分享
08-01 11:19
电气工程师
我懒羊羊觉得没问题:写的太学生化了,像作文一样,很难看出你和岗位的匹配度
点赞 评论 收藏
分享
08-21 10:10
复旦大学 运营
秋招第一个简历挂我的,有点不知好歹了
强大的社畜在走神:复旦✌️也挂吗,阿里云你想干嘛😡
投递阿里云等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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