很久没写题解了,也是很久没有安心做题了,上学期间还是把握不好节奏啊。
今天碰到一道好题,忍不住总结一下。
题意很简单,总结一下,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 0x3f3f3f3f
using 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;
}