USACO :Zero Sum解题报告

本文介绍了一种通过枚举所有可能的加减运算来寻找使得表达式结果为零的有效算法。对于长度为N的数字序列,文章提供了一个具体的C++实现方案,利用三进制数来遍历所有可能的运算组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相邻数字之间只有‘ ’,‘+’,‘-’三种可能,故当N=9时,最多只有3^8种情况。可以DFS,也可以采用三进制数来枚举,怎么也不超时。


/*
ID: xpli1
PROG: zerosum
LANG: C++
*/

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#define IN    fin
#define OUT    fout
#define max(a,b) (((a) > (b)) ? (a) : (b))

ifstream fin ("zerosum.in", ios::in);
ofstream fout("zerosum.out",ios::out);

int n;
char seq[17];
char chs[3] = {' ','+','-'};

int calc(int i){

 int k;

 for(k = 2 * n - 3; k >= 0; k -= 2){

  seq[k] = chs[i % 3];

  i /= 3;
 }
 
 int sum = 0;

 int temp = 0;

 char oper = '+';

 for(k = 0; k < 2 * n - 1; k++){
 
  if(seq[k] >= '1' && seq[k] <= '9'){
   
   temp += (seq[k] - '0');
  }

  else if(seq[k] == ' ') {temp *= 10;}

  else{

   if(oper == '+') { sum += temp;}

   else { sum -= temp; }

   oper = seq[k];

   temp = 0;
  }
 }

 if(oper == '+') { sum += temp;}

 else { sum -= temp; }

 return sum;

}

int main(){

 IN >> n;

 int i,j=1;

 for(i = 0; i < 2 * n - 1; i += 2){ seq[i] = '0'+j; j++; }

 int CASE = 1;

 for(i = 1; i < 2 * n - 1; i += 2) {CASE *= 3;}

 for(i = 0; i < CASE; i++){

  int res = calc(i);

  if(res == 0){

   for(j = 0; j < 2 * n - 1; j++){ OUT << seq[j];}

   OUT << endl;
  }
 }

 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值