HDU 5308
手工一个个算过去,发现
n=12时,我们可以通过(x+x+x+x)/x*(x+x+x+x+x+x)/x=24,来得到24点。
n=13时,构造(x+x+x)/x*(x+x+x+x +x+x+x+x)/x=24,来得到24点。
当n>13时,
1)n为奇数,我们可以通过一加一减多余的x来使x只剩13个,并应用上方n=13时的式子来得到24点;
2)n为偶数,同理,一加一减消去多余的x,并应用n=12时的式子。
所以我们只用手动算出n<12时的式子即可,当然嫌麻烦也可以写个程序深搜一下。
#include<map>
#include<cmath>
#include<ctime>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string>
#define LL long long
using namespace std;
const int maxn=10005;
const LL Inf=1e18;
int n, m, x, y;
void solve(){
if(n<4){
puts("-1");
return;
}
if(n<12){
if(n==4){
puts("1 * 2"); puts("5 + 3");
puts("6 + 4");
}else if(n==5){
puts("1 / 2"); puts("6 / 3");
puts("4 - 7"); puts("8 * 5");
}else if(n==6){
puts("1 + 2"); puts("7 + 3");
puts("8 + 4"); puts("9 + 5");
puts("10 - 6");
}else if(n==7){
puts("1 + 2"); puts("8 + 3");
puts("9 / 4"); puts("10 + 5");
puts("11 + 6"); puts("12 + 7");
}else if(n==8){
puts("1 + 2"); puts("9 / 3");
puts("4 / 5"); puts("10 + 11");
puts("6 + 7"); puts("13 - 8");
puts("12 * 14");
}else if(n==9){
puts("1 + 2"); puts("10 + 3");
puts("11 / 4"); puts("12 * 5");
puts("6 + 7"); puts("14 + 8");
puts("15 / 9"); puts("13 - 16");
}else if(n==10){
puts("1 + 2"); puts("11 + 3");
puts("4 + 5"); puts("13 + 6");
puts("14 + 7"); puts("15 + 8");
puts("16 + 9"); puts("17 / 10");
puts("12 - 18");
}else if(n==11){
puts("1 + 2"); puts("3 + 4");
puts("13 / 5"); puts("12 + 14");
puts("15 + 6"); puts("16 - 7");
puts("17 + 8"); puts("18 - 9");
puts("19 + 10"); puts("20 - 11");
}
return ;
}
if(n%2){
puts("1 + 2");
printf("3 + %d\n",n+1);
printf("%d / 4\n",n+2);
puts("5 + 6");
printf("7 + %d\n",n+4);
printf("8 + %d\n",n+5);
printf("9 + %d\n",n+6);
printf("10 + %d\n",n+7);
printf("11 + %d\n",n+8);
printf("12 + %d\n",n+9);
printf("%d / 13\n",n+10);
printf("%d * %d\n",n+3, n+11);
for(int i=n+12,j=14;j<=n;i+=2, j+=2){
printf("%d + %d\n",i, j);
printf("%d - %d\n",i+1, j+1);
}
}else{
puts("1 + 2");
printf("3 + %d\n",n+1);
printf("4 + %d\n",n+2);
printf("%d / 5\n",n+3);
puts("6 + 7");
printf("8 + %d\n",n+5);
printf("9 + %d\n",n+6);
printf("10 + %d\n",n+7);
printf("11 + %d\n",n+8);
printf("%d / 12\n",n+9);
printf("%d * %d\n",n+4, n+10);
for(int i=n+11,j=13;j<=n;i+=2,j+=2){
printf("%d + %d\n",i, j);
printf("%d - %d\n",i+1, j+1);
}
}
}
int main(){
// freopen("matrix.in","r",stdin);//从in.txt中读取数据
// freopen("matrix.out","w",stdout);//输出到out.txt文件
while(~scanf("%d",&n)){
solve();
}
return 0;
}