Codeforces Round #278 (Div. 2) B. Candy Boxes (模拟,数学)

来源:互联网 发布:怎么变成大小为1矩阵 编辑:程序博客网 时间:2024/05/16 09:41

很久没写题解了,也是很久没有安心做题了,上学期间还是把握不好节奏啊。

今天碰到一道好题,忍不住总结一下。

题意很简单,总结一下,4个数字,满足三个条件:

 1. x4=3*x1    4*x1=x2+x3

 2. 均是整数

 3. 1<=x1<=x2<=x3<=x4

输入n个数字,位置顺序不确定,判断是否有可能满足以上条件。如果满足,输出其余数字。

这道题重点就是思维一定要缜密,而且注意题意是,只要有满足条件的即可。各种情况总结如下:

1.n=0

 随意列举一组  1 2 2 3

2.n=1

 只需将此数视为x1,其他按照条件计算即可。

3.n=2

 四种情况

 ①x1 x2 或 x1 x3
    稍加分析可知,x2 x3基本等同,只是x3>=x2,随机应变调换顺序即可。
    条件一,可计算出x3 x4;
    条件二,根据整数运算规律,整数乘法加减法结果仍是整数;
    条件三,只需x4>=x3即可 即 3x1>=x2;
 ②x1 x4
    条件一,需满足x4=3*x1,x2 x3只需找到可满足结果即可,分析知,若使x2=x3=2*x1,即可满足条件;
    条件二,条件三均可满足;
 ③x2 x4 或 x3 x4
    条件一,可得x4/3=x1,可计算出x3;
    条件二,x1需满足整数条件,即 x4%3=0;
    条件三,需满足x2>=x1,即 x2,x3>=x1  即3*x1>=x2>=x1
 ④x2 x3
    条件一,可计算出x1,随之可计算出x4;
    条件二,x1需满足整数,即x2+x3%4=0;
    条件三,需满足x4>=x3   x2>=x1 ,即3*x1>=x3 且x2>=x1;

 综上分析条件
 若满足 x4=3*x1,则②情况即可
 若满足 3*x1>=x2,则①情况即可满足,否则③④也不可满足;
  因只需找到可满足情况即可,只需考虑①②即可。

同理,n=3时,分析情况
  ①x1 x2 x3
 条件一,需满足 x2+x3=4*x1;
 条件三,3*x1>=x3;
 ②x1 x2 x4 或 x1 x3 x4
 条件一,需满足x4=3*x1;
 条件三,需满足 x3>=x1   x2>=x1,即3*x1>=x2 且 x2>=x1;
 ③x2 x3 x4
 条件一,需满足x2+x3=4*x1;
 条件二,x4%3=0;
 条件三,x2>=x1;
  

 综上分析条件

 若满足 3*x1>=x2

    1.若满足 x4=3*x1 情况②

    2.若满足 x2+x3=4*x1 情况①

 若满足x4%3=0

    情况③


4.n=4

 此时只需判断是否满足条件即可。


程序代码如下。

第一次用这么多函数,以前嫌麻烦,但是毕竟是面向对象,像这种情况复杂的程序,反而思路清晰很多,以后多用用。

#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <ctime>#include <stack>#include <algorithm>#include <cstring>#include <utility>#define lld long long#define INF 0x3f3f3f3fusing namespace std;int n;int ini[5],cad[5];bool flag;void input(){    for(int i=1;i<=n;i++)    {        scanf("%d",&ini[i]);    }    sort(ini+1,ini+1+n);    //排好顺序很必要}void solve0(){    cad[1]=1; cad[2]=2; cad[3]=2; cad[4]=3;    flag=true;}void solve1(){    cad[1]=2*ini[1]; cad[2]=cad[1]; cad[3]=3*ini[1];    flag=true;}void solve2(){    if(ini[2]==3*ini[1])    {        cad[1]=2*ini[1]; cad[2]=cad[1];        flag=true;    }    else if(3*ini[1]>=ini[2])    {        cad[2]=3*ini[1]; cad[1]=4*ini[1]-ini[2];        flag=true;    }}void solve3(){    if(3*ini[1]>=ini[2])    {        if(ini[3]==3*ini[1])        {            cad[1]=4*ini[1]-ini[2];            flag=true;        }        else if(ini[2]+ini[3]==4*ini[1])        {            cad[1]=3*ini[1];            flag=true;        }    }    if(ini[3]%3==0 && ini[1]>=ini[3]/3 && ini[1]+ini[2]==(4*ini[3]/3))    {        cad[1]=ini[3]/3;        flag=true;    }}void solve4(){    if(ini[2]+ini[3]==4*ini[1])        if(ini[4]==3*ini[1])            flag=true;}void solve(){    flag=false;    if(n==0)        solve0();    if(n==1)        solve1();    if(n==2)        solve2();    if(n==3)        solve3();    if(n==4)        solve4();}void output(){    if(flag)    {        printf("YES\n");        for(int i=1;i<=4-n;i++)            printf("%d\n",cad[i]);    }    else        printf("NO\n");}int main(){    while(cin>>n)    {        input();        solve();        output();    }    return 0;}

0 0
原创粉丝点击