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
- Codeforces Round #278 (Div. 2) B. Candy Boxes (模拟,数学)
- Codeforces Round #278 (Div. 2)B—— Candy Boxes
- Codeforces Round #278 (Div. 2) B - Candy Boxes
- Codeforces Round #278 (Div. 2) B. Candy Boxes
- Codeforces Round #278 (Div. 2)B. Candy Boxes
- Codeforces Round #278 (Div. 2)---B. Candy Boxes (暴力+构造)
- Codeforces Round #229 (Div. 2) C. Inna and Candy Boxes
- Codeforces Round #229 (Div. 2)C. Inna and Candy Boxes
- Codeforces Round #229 (Div. 2) C. Inna and Candy Boxes ACM解题报告(预处理)
- Codeforces 488 B. Candy Boxes(构造)
- Codeforces Round #282 (Div. 2) B.(数学)
- Codeforces Round #194 (Div. 2) / 334A Candy Bags(模拟)
- Codeforces Round #328 (Div. 2) A(模拟) B(数学) C(数学)
- Codeforces Round #229 (Div. 2)C - Inna and Candy Boxes心得
- Codeforces Round #340 (Div. 2)(B) 数学
- Codeforces Round #341 (Div. 2)(B)数学
- Codeforces Round #246 (Div. 2)(B)数学
- Codeforces Round #353 (Div. 2)-B. Restoring Painting(数学)
- 深入理解Android(一):Gradle详解
- OCX开发手记
- Ubuntu 默认安装的vi超级难用
- UVa Online Judge 工具網站
- 【POI2010】【BZOJ2091】The Minima Game
- Codeforces Round #278 (Div. 2) B. Candy Boxes (模拟,数学)
- 明锐 非独立悬挂 大众质量不行
- 【MinaFile】【十二】【2.0】测试服务器和客户端的交互
- markdown写作技巧
- HDU-2030-汉字统计
- Android ImgeLoader
- hibernate缓存机制详细分析(一级、二级、查询缓存,非常清晰明白)
- hdu1757 A Simple Math Problem (矩阵快速幂)
- Swarm 源码解析