zoukankan      html  css  js  c++  java
  • [NOIP2002 提高组] 均分纸牌

    【问题描述】

      有 n 堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为 n 的倍数。可以在任一堆上取若于张纸牌,然后移动。

      移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为 n-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

      现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

    【输入格式】

      第 1 行为整数n,表示有n堆纸牌。

      第 2 行有 n 个整数:A1 A2 … An ,Ai 表示第 i 堆纸牌初始数量。

    【输出格式】

      所有堆均达到相等时的最少移动次数。

    【输入样例】 4 9 8 17 6

    【输出样例】 3

    【数据范围】 1 <= N <= 100  , l<= Ai <=10000

    【分析】

    跟分油差不多吧……


    1
    #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int main() { 6 7   a[10000],x,n,sum=0,k=0; 8 9   scanf("%d",&n); 10 11   for(int i=0;i<n;i++) 12 13   { 14 15     scanf("%d",&a[i]); 16 17     sum=sum+a[i]; 18 19   } 20 21   x=sum/n; 22 23   for(int i=0;i<n;i++) 24 25   { 26 27     a[i]=a[i]-x; 28 29   } 30 31   for(int i=0;i<n;i++) 32 33   { 34 35     if(a[i]==0) 36 37     { 38 39       continue; 40 41     } 42 43     a[i+1]=a[i+1]+a[i]; 44 45     k++; 46 47   } 48 49   printf("%d",k); 50 51   return 0; 52 53 }`#include<bits/stdc++.h> 54 55 using namespace std; 56 57 int main() { 58 59   a[10000],x,n,sum=0,k=0; 60 61   scanf("%d",&n); 62 63   for(int i=0;i<n;i++) 64 65   { 66 67     scanf("%d",&a[i]); 68 69     sum=sum+a[i]; 70 71   } 72 73   x=sum/n; 74 75   for(int i=0;i<n;i++) 76 77   { 78 79     a[i]=a[i]-x; 80 81   } 82 83   for(int i=0;i<n;i++) 84 85   { 86 87     if(a[i]==0) 88 89     { 90 91       continue; 92 93     } 94 95     a[i+1]=a[i+1]+a[i]; 96 97     k++; 98 99   } 100 101   printf("%d",k); 102 103   return 0; 104 105 }`
  • 相关阅读:
    Linux C编程之二十一 Linux高并发web服务器开发
    Linux C编程之二十 xml-json
    Linux C编程之十九(2) libevent
    Linux C编程之十九(1) libevent基本概念
    Linux C编程之八 文件操作相关函数
    Linux C编程之七(2) 系统IO函数
    Linux C编程之六 makefile项目管理
    Linux C编程之四 动态库(共享库)的制作
    Linux C编程之五 gdb调试
    .net core 3.1 mvc string接收为null解决方案
  • 原文地址:https://www.cnblogs.com/TheZealous/p/14280795.html
Copyright © 2011-2022 走看看