题意:n个 n构造出一个24点的式子来。
特判n<14的所有情况(注意当1 2 3的时候不行),例如 5 :(5*5*5-5)/5 7:(7+7+7)/7+7+7+7,然后对于大于等于14的,构造4*6,如(x+x+x+x)/x*(x+x+x+x+x+x)/x+(x-x)*x....这样子,然后输出.
另附我A spj代码
//#include <bits/stdc++.h>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <time.h>
#include <vector>
#include <cstdio>
#include <string>
#include <iomanip>
///cout << fixed << setprecision(13) << (double) x << endl;
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define ls rt << 1
#define rs rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define Mp(a, b) make_pair(a, b)
#define asd puts("asdasdasdasdasdf");
typedef long long ll;
//typedef __int64 LL;
const int inf = 0x3f3f3f3f;
int n;
int main()
{
//freopen( "date.in", "w", stdout );
while( ~scanf("%d", &n) ) {
//for( n = 4; n <= 110; ++n ) {
int x = n;
//printf("%d\n", x);
if( n <= 3 ) {
printf("-1\n");
continue;
}
if( x == 9 ) {
printf("1 + 2\n");
printf("10 + 3\n");
for( int i = 4; i <= 6; ++i )
printf("%d / %d\n", i, i + 3);
printf("13 + 12\n");
printf("15 + 14\n");
printf("11 - 16\n");
continue;
}
if( x == 4 ) {
printf("1 * 2\n");
printf("5 + 3\n");
printf("6 + 4\n");
continue;
}
if( x == 5 ) {
printf("1 * 2\n");
printf("3 * 6\n");
printf("7 - 4\n");
printf("8 / 5\n");
continue;
}
if( n == 6 ) {
printf("1 + 2\n");
printf("3 + 4\n");
printf("5 - 6\n");
printf("7 + 8\n");
printf("10 + 9\n");
continue;
}
if( n == 7 ) {
printf("1 + 2\n"); //8 14
printf("3 + 8\n"); //9 21
printf("4 + 5\n"); //10 14
printf("6 + 10\n"); //11 21
printf("11 / 7\n");
printf("9 + 12\n");
continue;
}
if( n == 8 ) {
printf("1 + 2\n"); //9 16
printf("3 + 9\n"); //10 24
printf("4 - 5\n"); //11 0
printf("11 * 6\n"); //12
printf("12 * 7\n");
printf("13 * 8\n");
printf("14 + 10\n");
continue;
}
if( n == 10 ) {
printf("1 + 2\n"); //11 20
printf("3 / 4\n"); //12 1
printf("5 / 6\n"); //13 1
printf("7 / 8\n"); //14 1
printf("9 / 10\n"); //15 1
printf("11 + 12\n"); //16
printf("16 + 13\n");
printf("17 + 14\n");
printf("18 + 15\n");
continue;
}
if( n == 11 ) {
printf("2 / 3\n"); //12 1
printf("4 / 5\n"); //13 1
printf("6 / 7\n"); //14 1
printf("8 / 9\n"); //15 1
printf("10 / 11\n");//16 1
printf("12 + 13\n");//17 2
printf("1 * 17\n"); //18 22
printf("14 * 15\n");//19 1
printf("18 + 19\n");//20 23
printf("20 + 16\n");
continue;
}
if( n == 12 ) {
printf("3 / 4\n");
printf("5 / 6\n");
printf("7 / 8\n");
printf("9 / 10\n");
printf("11 / 12\n"); //13~17
printf("13 - 14\n");//18
printf("18 * 15\n");
printf("19 * 16\n");
printf("20 * 17\n");
printf("21 + 2\n");
printf("22 + 1\n");
continue;
}
if( n == 13 ) {
printf("2 / 3\n"); //14
printf("4 / 5\n"); //15
printf("6 / 7\n"); //16
printf("8 / 9\n"); //17
printf("10 / 11\n");//18
printf("12 / 13\n");//19
printf("15 + 16\n");//20 2
printf("1 - 14\n"); //21 12
printf("21 * 20\n");//22
printf("22 * 17\n");
printf("23 * 18\n");
printf("24 * 19\n");
continue;
}
if( n >= 14 ) {
printf("1 + 2\n");//n+1
printf("3 + 4\n");//n+2
printf("5 + 6\n");//n+3
printf("7 + 8\n");//n+4
printf("9 + 10\n");//n+5
printf("%d + %d\n", n+1, n+2); //n+6
printf("%d / %d\n", n+6, 11); //n+7 4
printf("%d + %d\n", n+3, n+4); //n+8
printf("%d + %d\n", n+8, n+5); //n+9
printf("%d / %d\n", n+9, 12); //n+10 6
printf("%d * %d\n", n+10, n+7); //n+11 24
printf("13 - 14\n"); //n+12 0
for( int i = 15; i <= n; ++i ) {
printf("%d * %d\n", i, n+i-3);
}
printf("%d + %d\n", n+11, 2*n-2);
}
}
return 0;
}
spj代码:
int arr[220010];
char op[10];
int main() {
freopen("date.in", "r", stdin);
//freopen("date.out", "w", stdout);
int i;
while( ~scanf("%d", &i) ) {
for (int j = 1; j <= i; ++j) {
arr[j] = i;
}
int u, v;
int cnt = i + 1;
for (int j = 1; j <= i - 1; ++j) {
scanf("%d%s%d", &u, op, &v);
if (op[0] == '+') {
arr[cnt++] = arr[u] + arr[v];
}
else if (op[0] == '-') {
arr[cnt++] = arr[u] - arr[v];
}
else if (op[0] == '*') {
arr[cnt++] = arr[u] * arr[v];
}
else {
arr[cnt++] = arr[u] / arr[v];
}
}
printf("%d\n", arr[cnt - 1]);
}
return 0;
}