2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题
I Wanna Become A 24-Point Master
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 60 Accepted Submission(s): 16
Special Judge
Quickly, Rikka solved almost all of the problems but the remained one is really difficult:
In this problem, you need to write a program which can get 24 points with n numbers,
which are all equal to n.
Each testcase contains only one integer n (1≤n≤105)
If there is not any way to get 24 points, print a single line with -1.
Otherwise, let A be
an array with 2n−1 numbers
and at firsrt Ai=n (1≤i≤n).
You need to print n−1 lines
and the ith
line contains one integer a,
one char b and
then one integer c, where 1≤a,c<n+i and b is
"+","-","*" or "/". This line means that you let Aa and Ac do
the operation b and
store the answer into An+i.
If your answer satisfies the following rule, we think your answer is right:
1. A2n−1=24
2. Each position of the array A is
used at most one tine.
3. The absolute value of the numerator and denominator of each element in array A is
no more than 109
4
1 * 2
5 + 3
6 + 4
题意:
输入N。
用N个N通过加减乘除得到24.中间过程得到的数字能够用分数表示,不能截断小数。
分析:前几个数字打表吧。非常easy写的。可是我队员(GMY)也是写的非常辛苦啊。========(如今看到是改动过后的,所以打表的部分少了)
后面的数字这样处理:
选a个N相加 使得|a*N-24|最小,这样做的目的是为了降低用于构造24的N的使用量。
且令b = |24-a*N| (a*N+b = 24 或者a*N-b = 24)构造这个等式就能够了。
那么用b+1个N就能构造 b了 。
方法: (N *b)/N = b
剩下left = N - a - b - 1个N。用left个N构造0就可以。
显然left >= 2 (7特判了,就不怕有bug了)
假设left 为奇数
构造 (N*(left/2) - N(left/2))/N = 0
否则 构造 N*(left/2) - N(left/2) = 0
所以left个N一定能够构造出0的
最后看b > 0 那么用a*N - b
否则用a*N + b
当然要特别考虑b = 0,的情况。
由于保证left > 0 了。
所以先构造出0.方便后面的运算。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int main(){
int n;
while(~scanf("%d",&n))
{
if( n == 1 || n == 2 || n == 3 ){
printf("-1\n");
}
else if( n == 4 )
printf("1 * 2\n5 + 3\n6 + 4\n");
else if( n == 5 )
printf("1 * 2\n6 * 3\n7 - 4\n8 / 5\n");
else if( n == 7 )
printf("1 + 2\n8 + 3\n4 + 5\n10 + 6\n11 / 7\n9 + 12\n"); //为了保证left > 1 n = 7 特判
else {
int i,j,k,q,p,left,need;
for(i = 0;;i++){
if(abs(i*n - 24) <= abs(i*n+n-24) )
break;
}
int a = i; //算出几个N相加会最接近于24
int fx = 24 - a*n; //算出 24 - a * N 关于0的大小
if( abs(24-a*n) > 0 )need = abs(24-a*n) + 1;
else need = 0; //算出须要need个N来构造 出|24 - a*N|
left = n - need - i; //用left个N构造出0 //用left个N构造0
printf("1 - 2\n");
p = n + 1;
i = 3;
j = 0;
for(;i <= (left - left% 2); ){
if(j & 1 ){
printf("%d - %d\n",p++,i++);
}
else printf("%d + %d\n",p++,i++);
j ^= 1;
}
//left 为奇数。多计算一次 0 / N
if(left % 2 == 1){
printf("%d / %d\n",p++,i++);
} //构造a个N相加的和
q = i;
for(i = 0;i < a; i++){
printf("%d + %d\n",p++,q++);
} int xp;
if(need > 0){
//need = 2 直接做除法,否则先做加法,最后做除法
if(need != 2){
printf("%d + %d\n",q,q+1);
q += 2;
xp = p + 1;
for(; q < n; ){
printf("%d + %d\n",xp++,q++);
}
printf("%d / %d\n",xp++,q++);
}
else {
printf("%d / %d\n",q,q+i);
xp = p + 1; }
//推断是加法还是减法
if(fx > 0)
printf("%d + %d\n",p,xp);
else
printf("%d - %d\n",p,xp);
}
}
}
return 0;
}
2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题的更多相关文章
- 2015多校联合训练赛hdu 5301 Buildings 2015 Multi-University Training Contest 2 简单题
Buildings Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法
The sum of gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) T ...
- hdu 5358 First One 2015多校联合训练赛#6 枚举
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- hdu 5361 2015多校联合训练赛#6 最短路
In Touch Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total ...
- HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)
pid=5358">HDU 5358 题意: 求∑i=1n∑j=in(⌊log2S(i,j)⌋+1)∗(i+j). 思路: S(i,j) < 10^10 & ...
- HDU 5371 (2015多校联合训练赛第七场1003)Hotaru's problem(manacher+二分/枚举)
pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序 ...
- 2015多校联合训练赛 Training Contest 4 1008
构造题: 比赛的时候只想到:前面一样的数,后面 是类似1,2,3,4,5,6....t这 既是:t+1,t+1...,1,2,3,...t t+1的数目 可能 很多, 题解时YY出一个N 然后对N ...
- HDU OJ 5317 RGCDQ( 2015多校联合训练第3场) 暴力打表+小技巧
题目连接:Click here 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(1 ...
- HDU OJ 5326 Work( 2015多校联合训练第3场) 并查集
题目连接:戳ME #include <iostream> #include <cstdio> #include <cstring> using namespace ...
随机推荐
- Python 35 进程间的通信(IPC机制)、生产者消费者模型
一:进程间的通信(IPC):先进先出 管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...
- JavaScript中的+= 是什么?
+=表示相加并赋值,“i+=5”与“i=i+5”是等效的. 类似的运算符还有-=,*=,/=. i-=5等价于i=i-5; i*=5等价于i=i*5: i/=5等价于i=i/5.
- wap网测一道题目
1. 给定一个字符串s, 1 <= len(s) <= 3000, 定义odd palindrome string为长度为奇数的回文串, 求s中该奇回文串的个数. 比如axbcba , 结 ...
- php解析 html类库 simple_html_dom
如果从字符串加载html文档,需要先从网络上下载.建议使用cURL来抓取html文档并加载DOM中. 查找html元素 可以使用find函数来查找html文档中的元素.返回的结果是一个包含了对象的数组 ...
- angular2之组件通讯
定义父组件,在父组件中以路由插座形式引入子组件,定义相关输入输出属性 可以在同一模块内部定义多个组件,将一个组件引入另一个组件中去:也可以该模块整体导出,将该模块导入到其他模块,这样此模块中的组件就能 ...
- ★Java语法(三)——————————变量常量
变量 1.命名规则:变量是标识符,遵循标识符命名规则: 2.作用范围: a 成员变量:作用范围是整个类: package 课上练习; public class 变量 { ; public static ...
- 三维重建:SLAM相关的一些术语解释
SLAM是一个工程问题,再次复习一下工程中可能用到的名词解释. 还是不要看了,高翔的科普读物已经出版了,读他的<slam十四讲>就可以了. 一.度量相关: 世界坐标系:描述图像的平面坐标系 ...
- HDU_3999_二叉排序树
The order of a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- this、super关键字以及他们各自的作用
this:代表当前对象的引用,谁来调用我,我就代表谁 super:代表当前对象父类的引用 this和super的使用区别 A:调用成员变量 this.成员变量 调用本类的成员变量,也可以调用父类的成 ...
- Apex语言(九)类的方法
1.方法 方法是对象的行为.如下表: 看书,编程,打球就是方法. 2.创建方法 [格式] 访问修饰符 返回值类型 方法名(形式参数列表){ 方法体; } 访问修饰符:可以为类方法指定访问级别. 例如, ...