标题:[没人气,抄道题] 分糖果
只看楼主
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:15 
处理有相同等级值的情况
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *data;
    int fen(int*,int);
   
    scanf("%d", &n);
    data = (int*)malloc(sizeof(int) * n);
    for (i = 0; i < n; ++i) scanf("%d",&data[i]);
        
    printf("%d\n", fen(data, n));
    free(data);
    return 0;
}

int fen(int*data,int n)
{
  int i,sum=0,m,k,f,s=1;
  
  m=1;
  sum+=m;
  k=0;
  f=1;
  for(i=1;i<n;++i)
  {
  if (data[i]== data[i-1])
  {
   sum+=m;     
  if(i==0) k++;
  if(i==1) s++;   
  }
  else if (data[i]< data[i-1])
   {
        f=0;
      k++;
      m--;
      sum+=m;   
   }
  else
   {
        if(f==1)
          {
             m++;
           sum+=m;
           s=1;   
          }
      else
        {
             if(m<1)sum+=(k+s)*(1-m);
             if(m>1)sum-=k*(m-1);
             m=2;
             sum+=m;
             k=0;
             f=1;
                s=1;
        }
   }
  }
   if(f==0)
    {
     if(m<1)sum+=(k+s)*(1-m);
     if(m>1)sum-=k*(m-1);   
    }
return sum;   
}
2015-08-07 07:56
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
先设定起点,每个孩子拿到和自己权值相同数目的糖果,然后根据规则改变当前的糖果数,当一次遍历后没有孩子的糖果数目发生改变即为终点.

当相邻的小孩权值相同时,把两个人看成一个人计算就行了.

程序代码:
#include <math.h>
#include <stdio.h>

#define CHILD_COUNT  (sizeof(ans) / sizeof(Child) - 2)

typedef struct ChildNode
{
    int level;
    int candy;
}Child;

int times = 0;
Child ans[] = {{999, 999}, {1, 1}, {3, 3}, {7, 7}, {5, 5}, {3, 3}, {5, 5}, {999, 999}};

/**
* 打印结果
*/
void print()
{
    printf("=========%02d=========\n", ++times);
    for (int i = 1;i <= CHILD_COUNT;i++)
    {
        printf("%3d", ans[i].level);
    }
    printf("\n");
    for (int i = 1;i <= CHILD_COUNT;i++)
    {
        printf("%3d", ans[i].candy);
    }
    printf("\n");
}

/**
* 改变pos的值
*/
void change(int pos)
{
    int tmp = 0;
    if (ans[pos - 1].level < ans[pos].level && ans[pos + 1].level < ans[pos].level)
    {
        tmp = ans[pos - 1].candy > ans[pos + 1].candy 
            ? ans[pos - 1].candy : ans[pos + 1].candy;
    }
    else if (ans[pos - 1].level < ans[pos].level && ans[pos + 1].level > ans[pos].level)
    {
        tmp = ans[pos - 1].candy;
    }
    else if (ans[pos - 1].level > ans[pos].level && ans[pos + 1].level < ans[pos].level)
    {
        tmp = ans[pos + 1].candy;
    }
    else
    {
    }
    if (ans[pos].candy == tmp + 1)  return;
    ans[pos].candy = tmp + 1;
    print();
}

int sumAll()
{
    int sum = 0;
    for (int i = 1;i <= CHILD_COUNT;i++)
    {
        sum += ans[i].candy;
    }
    return sum;
}
int main(int argc, char *argv[])
{
    int old = 1, now = sumAll();

    print();
    while (old != now)
    {
        old = now;
        for (int i = 1;i <= CHILD_COUNT;change(i++));
        now = sumAll();
    }
    return 0;
}


[ 本帖最后由 azzbcc 于 2015-8-8 08:28 编辑 ]


[fly]存在即是合理[/fly]
2015-08-08 01:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-456149-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.520952 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved