CodeForces Gym 100989L Plus or Minus (A) DFS
2016-07-14 18:12
316 查看
水题,DFS暴搜一发就行
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <cstring> #include <vector> using namespace std; #define ll long long #define maxn 100005 int N; int num[22]; ll numsum[22]; int initsign[22]; int nowsign[22]; char str[300]; int ans = 22; int readint() { int tmp = 0; char ch; bool read = false; while (ch = getchar()) { if (ch >= '0'&&ch <= '9') { read = true; tmp = tmp * 10 + ch - '0'; } else if (read) { break; } else { continue; } } return tmp; } char readchar() { char tmp = 0; char ch; bool read = false; while (ch = getchar()) { if (ch == '-' || ch == '+') { read = true; tmp = ch; } else if (read) { break; } else { continue; } } return tmp; } void work(int pos,ll sum) { if (pos == N - 1) { if (sum == 0) { int tmp = 0; for (int i = 1; i < N; ++i) { if (initsign[i] != nowsign[i]) ++tmp; } if (ans > tmp) ans = tmp; /*for (int i = 1; i < N; ++i) printf("%d ", nowsign[i]); printf("\n"); printf("%d\n", tmp);*/ } return; } if (sum > numsum[pos + 1] || sum < -numsum[pos + 1]) return; if (sum == numsum[pos + 1]) { for (int i = pos + 1; i < N; ++i) nowsign[i] = -1; int tmp = 0; for (int i = 1; i < N; ++i) { if (initsign[i] != nowsign[i]) ++tmp; } if (ans > tmp) ans = tmp; /*for (int i = 1; i < N; ++i) printf("%d ", nowsign[i]); printf("\n"); printf("%d\n", tmp);*/ return; } else if (sum == -numsum[pos + 1]) { for (int i = pos + 1; i < N; ++i) nowsign[i] = 1; int tmp = 0; for (int i = 1; i < N; ++i) { if (initsign[i] != nowsign[i]) ++tmp; } if (ans > tmp) ans = tmp; /*for (int i = 1; i < N; ++i) printf("%d ", nowsign[i]); printf("\n"); printf("%d\n", tmp);*/ return; } nowsign[pos + 1] = 1; work(pos + 1, sum + num[pos + 1]); nowsign[pos + 1] = -1; work(pos + 1, sum - num[pos + 1]); } int main() { //freopen("input.txt", "r", stdin); N = readint(); num[0] = readint(); char sign; for (int i = 1; i < N; ++i) { sign = readchar(); if (sign == '-') initsign[i] = -1; else if (sign == '+') initsign[i] = 1; num[i] = readint(); } /*for (int i = 0; i < N; ++i) printf("%d ", num[i]); printf("\n"); for (int i = 0; i < N; ++i) printf("%d ", initsign[i]); printf("\n");*/ for (int i = N - 1; i >= 0; --i) { numsum[i] = numsum[i + 1] + num[i]; } /*for (int i = 0; i < N; ++i) printf("%d ", numsum[i]); printf("\n");*/ work(0, num[0]); if (ans == 22) printf("-1\n"); else printf("%d\n", ans); //system("pause"); //while (1); return 0; }
相关文章推荐
- 用JS获取地址栏参数的方法(超级简单)
- 看起来像它——图像搜索其实也不难
- 性能测试白皮书积累
- 性能测试白皮书积累
- Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制
- 为什么Button点击了没反应,反而其他事件反应了
- linux 环境下 Access,Modify,Change区别以及find指令简易使用方法
- nginx下laravel框架rewrite的设置
- MySQL索引学习漫画
- Mac OS X Mavericks or Yosemite 安装Nginx、PHP、Mysql、phpMyAdmin
- 记YY的一次面试经历
- js中的数组操作
- struts1+ajax+jquery上传文件
- Undo管理
- Eclipse常用设置
- java加载机制整理
- 如何判断一个APP页面是原生的还是H5页面
- Mac OS X Mavericks or Yosemite 安装Nginx、PHP、Mysql、phpMyAdmin
- 揭秘Facebook首个数据中心:全球15亿用户的账户信息都在这里
- CodeForces Gym 100989H Queue (A)