zoukankan      html  css  js  c++  java
  • codeforces 484B

    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;
    }
  • 相关阅读:
    C和指针 第十七章 经典数据类型 堆栈 队列 二叉树
    C和指针 第十六章 习题
    C和指针 第十六章 标准函数库 信号
    C和指针 第十六章 标准函数库 本地跳转setjmp.h
    C和指针 第十六章 标准函数库
    C和指针 第十五章 习题
    C和指针 第十五章 二进制I/O
    C和指针 第十五章 文件I/O
    C和指针 第十五章 输入输出缓冲
    C和指针 第十五章 错误报告perror和exit
  • 原文地址:https://www.cnblogs.com/pprp/p/7410614.html
Copyright © 2011-2022 走看看