标签:
4
1 * 2 5 + 3 6 + 4
#include <bits/stdc++.h> using namespace std; #define prt(k) cerr<<#k" = "<<k<<endl typedef long long ll; int n; const int N = 200222; int d[N]; int t; bool vis[N]; int a, b; inline void g(int x, char c, int y) { assert(!vis[x] && !vis[y] && 1<=x&&x<=t && 1<=y&&y<=t); vis[x] = vis[y] = 1; if (c=='+') d[++t] = d[x] + d[y]; if (c=='-') d[++t] = d[x] - d[y]; if (c=='*') d[++t] = d[x] * d[y]; if (c=='/') d[++t] = d[x] / d[y]; if (t==2*n-1) assert(d[t]==24); } inline void f(int x, char c, int y) { printf("%d %c %d\n", x, c, y); g(x, c, y); } inline void f(char c) { if (a==1 ) { f(1, c, 2); a=3; return; } f(b++, c, a++); } inline void f(string s) { int x, y; char op[5], c; sscanf(s.c_str(), "%d%s%d", &x, op, &y); c = op[0]; puts(s.c_str()); g(x, c, y); } int main() { while (scanf("%d", &n)==1 ) { memset(vis, 0 , sizeof vis); if (n < 4) { puts("-1"); continue; } t = n; memset(d, -1, sizeof d); for (int i=1;i<=n;i++) d[i]=n; a = 1, b=n+1; if (n == 4) { f(1, '*', 2); f(5, '+', 3); f(6, '+', 4); continue; } if (n == 5) { /// (5*5*5-5)/5 f(1, '*', 2); /// a6 = 25 f(6, '*', 3); /// a7 = 1 f(7, '-', 4); ///a8 = 24 f(8, '/', 5); // continue; } if (n==6) { f("1 * 2"); f("7 * 3"); f("8 / 4"); f("9 - 5"); f("10 - 6"); } if (n==7) { f("1 + 2"); f("3 + 8"); f("9 / 4"); f("10 + 5"); f("11 + 6"); f("12 + 7"); } if (n==8) { f("1 + 2"); f("3 + 9"); f("4 - 5"); f("11 * 6"); f("12 * 7"); f("13 * 8"); f("14 + 10"); } if (n==9) { f('+'); f('+'); int p= b++; f(a++,'/',a++); f(p, '-', b++); p = b++; f(a++,'/',a++); /// get 1; f(p, '-', b++); p = b++; f(a++,'/',a++); /// get 1; f(p, '-', b++); } if (n == 12 || n>=15) { f('+'); f(b++, '/', a++); int p2 = b; b++; f(a++, '+', a++); f('+'); f(b++, '/', a++); f(p2,'*',b++); int p6 = b; b++; f(a++, '+', a++); f('+'); f('+'); f(b++, '/', a++); f(p6, '*', b++); if (n==12) continue; int p24 = b++; f(a++,'-',a++); for (int i=0;i<n-14;i++) { f('*'); } f(b++,'+',p24); } if (10<=n && n<=11) { int p; f('+'); p = b++; for (int i=0;i<24-2*n;i++) { f(a++,'/',a++); f(p, '+', b++); p = b++; } if (n==11) { f(a++,'-',a++); for (int i=0;i<3;i++) { f('*'); } f(p, '+', b); } } if (13<=n && n<=14) { int p; f('+'); p = b++; for (int i=0;i<2*n-24;i++) { f(a++,'/',a++); f(p, '-', b++); p = b++; } f(a++,'-',a++); for (int i=0;i<(n==13 ? 5 : 2);i++) { f('*'); } f(p, '+', b); } assert(d[2*n-1]==24); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 5308 I Wanna Become A 24-Point Master
标签:
原文地址:http://blog.csdn.net/oilover/article/details/47029791