UESTC 1251 谕神的密码 贪心法
2015-12-06 00:00
591 查看
谕神的密码
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Submit
Status
谕神是集训队里面智商数一数二的大神,在他的电脑里储存着他在学习的东西。每天都要通过学习来提高自己的知识水平。然而,作为一个长者,谕神
不愿意将自己的学习资料给那些too young, too simple, sometimes naive的人看,以免被他们看了去搞一个大新闻。于是,谕神给自己的电脑设置了
密码。
当然,他设置的密码也要按照基本法。这个基本法是谕神自己搞出来的。法则是这样的:
1、密码由2个n位数组成,中间由空格隔开,其中,两个数的各个位的和均为s
2、是满足1条件的最小的数和最大的数
3、当找不到n位数的和为s的时候,密码就是:
-1 -1。
4、谕神保证密码的2个数中没有前导0。
他这个密码只是为了防止too young, too simple, sometimes naive的人进入电脑的,对于你们这些高智商的人群,破译密码应该并不难吧~~
注意,单独的0,是合法的哦~
Input
先读入一个T(0≤T≤100),为数据组数每组数据只有一行,为n(0<n≤100)和s(0≤s≤900).
Output
输出谕神的密码
Sample input and output
Sample Input | Sample Output |
---|---|
1 2 15 | 69 96 |
Hint
就一组测试数据 2位数各位和为15的最大值是96,最小值是69.
Source
第七届ACM趣味程序设计竞赛第二场(正式赛) B
My Solution
w9=s/9; y9=s-w9*9;
贪心, 最大的前面999....y9...最小的前面为1.......y9 99999
主要是上面这样,然后有几个地方y9=0是额外讨论(1......0899、999.....),没有0时二外讨论,只有1个0笔者也额外讨论了
虽然长,但很多地方差不多,所以好多地方是复制上面部分,然后再修改
比赛的时候,由于先输出最多值,再输出最小值,结果死活不能Accepted
因为题目讲先输出最小值,再最大值。两个小时啊(此水题不过去,自己过意不去,所以硬来),找出这么个bug,我也是欲哭无泪啊,以后多注意
输出顺序,不仅仅是输出格式
我记得高三有一次月考,我来了个F合=ma^2把一个大题错了 和这次感觉很像(┬_┬)
#include <iostream> #include <cstdio> #include <cstring> #define LOCAL using namespace std; int main() { #ifdef LOCAL freopen("a.txt","r",stdin); #endif int T,n,s,w9,y9; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&s); w9=s/9; y9=s-w9*9; if(n==0) printf("-1 -1"); if(s==0) {if(n==1)printf("0 0");else printf("-1 -1");} else if(s>9*n) printf("-1 -1"); else if(s==9*n){ for(int i=1;i<=n-1;i++) printf("9"); printf("9 "); for(int i=1;i<=n;i++) printf("9"); } else{ if(n-w9-1==0) { if(y9==0){ printf("18"); for(int i=1;i<=w9-1;i++) printf("9"); } else{ printf("%d",y9); for(int i=1;i<=w9;i++) printf("9"); } } else{ printf("1"); if(y9==0){ if(n-w9-2==0){ printf("08"); for(int i=1;i<=w9-1;i++) printf("9"); } else{ for(int k=1;k<=n-w9-2;k++) printf("0"); printf("08"); for(int i=1;i<=w9-1;i++) printf("9"); } } else{ if(n-w9-2==0){ printf("%d",y9-1); for(int i=1;i<=w9;i++) printf("9"); } else{ for(int k=1;k<=n-w9-2;k++) printf("0"); printf("%d",y9-1); for(int i=1;i<=w9;i++) printf("9"); } } } printf(" "); for(int i=1;i<=w9;i++) printf("9"); printf("%d",y9); for(int j=1;j<=n-w9-1;j++) printf("0"); } if(T) printf("\n"); } return 0; }
谢谢
相关文章推荐
- UESTC 1256 昊昊喜欢运动 n^2的预处理 or 前缀和
- Ubuntu 14 Trusty安装hue
- request.getParameterMap()使用方法
- 用XDOCBuilder制作精美的EPUB
- 如何避免UI界面中下拉框ComboBox文本项的硬编码?
- 基于swing的UI原型辅助设计
- 免费在线文字处理软件XDocBuilder发布7.4.0版本
- 如何通过UIView对象获取该对象所属的UIViewController
- 【Java】StudentsInfoQuery(简单的学生信息查询系统)
- UILable / UITextField / UIButton
- UIView / UIView的布局
- UIVIew之霓虹灯实现
- UILabel、UIImageView、UIButton的使用
- Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 10
- leetcode Implement Stack using Queues
- UIButton 解析
- zoj 3349 Special Subsequence 【离散化二分 + 线段树优化dp】
- Android中startActivity中的permission检测与UID机制
- [Android--UI]多屏幕设计
- MySQL报错“1366 - Incorrect integer value: '' XXXXXXX' at row 1 ”