codeforces 484B - LubaAndTicket - 贪心

2017-08-22 10:54:00

writer:pprp

题意如下:

给你6个数组,你的操作可以是更改某一位的数字成为0-9之间任意一个数,要求前三个数字的和与后三个数字的和相等。

问你最少用几步就可以完成?

分析:这个题太过武断的理解题目了,更改了两次方向才理解正确题目的意思;

一开始理解成只能增加某一位数,

后来比赛以后看了数据,然后理解成能增加或者减少

但是两个理解都不对

应该是每次都可以增加或者减少,大的数组应该减小,小的数组应该增大

贪心的去做

Wa了7次,WA到怀疑人生,最后总算是根据数据漏洞完成写出来AC代码

/*
theme:Luba and The Ticket
writer:pprp
description:审题有问题,可以随意改动一个数,使之变为0-9
自己一开始理解成只能增或者只能减,算法设计失误,重新设计,考虑到小的数组增加和大的数组减小
综合两种情况进行讨论
date:2017/8/22
*/

#include <bits/stdc++.h>

using namespace std;

int a[4], b[4];

int main()
{
    int ans = 0;

    for(int i = 1 ; i <= 3 ; i++)
        scanf("%1d",&a[i]);
    for(int i = 1; i <= 3; i++)
        scanf("%1d",&b[i]);

    int sum1 = 0, sum2 = 0;

    sort(a+1,a+4);
    sort(b+1,b+4);

    for(int i = 0 ; i < 3 ; i++)
    {
        sum1 += a[i+1];  
        sum2 += b[i+1];
    }

    //如果两个数组值恰好相等,直接输出0
    if(sum1 == sum2)
    {
        cout << 0 << endl;  
        return 0;
    }

    ans++;

    //如果数组a 的和大于数组b的和
    if(sum1 > sum2)
    {
        int i = 3;
        int j = 1;
        int cha = abs(sum1 - sum2);

        //sum的差值如果大于两种情况并且指针j没有越界
        while(cha > a[i] && cha > 9 - b[j] && j <= 3)
        {
            ans++;
            //如果大的数组减小幅度大于小的数组上升幅度,选择大的数组
            if(a[i] > 9 - b[j])
            {
                sum1 -= a[i];
                cha = cha - a[i];
                i--;
            }
            else
            {
                sum2 += 9 - b[j];   
                cha = cha - 9 + b[j];
                j++;                                                                                                    
            }
        } 
    }
    else if(sum1 < sum2)
    {
        int i = 3; 
        int j = 1;
        int cha = abs(sum1 - sum2);
        
        while(cha > b[i] && cha > 9 - a[j] && j <= 3)
        {
               ans++;
               if(b[i] > 9 - a[j])
               {
                     sum1 -= b[i];
                     cha -= b[i];
                     i--;
               }
               else
               {
                     sum2 += (9 - a[j]);
                     cha -= (9 - a[j]);
                     j++;
               }
        }
    }
        
    cout << ans << endl;


    return 0;
}

 

转载于:https://www.cnblogs.com/pprp/p/7410614.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值