uva 10317 Equating Equations
来源:互联网 发布:线切割编程软件hf 编辑:程序博客网 时间:2024/06/05 05:16
点击打开链接uva 10317
分析:
1 给定一个等式判断两边是否相等,如果一个等式相等那么通过移项到同一边可以得到正数的和等于负数
2 那么通过分析1我们可以知道我们可以求出这个等式的所有数字的和,判断和是否为偶数。如果和为奇数那么肯定不可能成立,因为不能被平分
3 通过分析2的剪枝之后,那么可以知道题目说了最多有16 个数字。那么我们就搜索这个2^16种状态,找到一个满足的即可。注意在搜索的过程中可以进行剪枝
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN = 10000;char inStr[MAXN]; char expStr[MAXN]; int num[MAXN];int pos , cnt , sum;void init(char *str){ int len = strlen(str); bool isLeft = true; pos = sum = 0; cnt = 1; int i = 0; while(i < len){ if(isalnum(str[i])){ int j = i; int tmp = 0; while(j < len && isalnum(str[j])){ tmp = tmp*10+str[j]-'0'; j++; } sum += tmp; num[pos++] = tmp; i = j-1; } else{ if(str[i] != ' ') expStr[pos] = str[i]; if(str[i] == '+' && isLeft) cnt++; if(str[i] == '=') isLeft = false; if(str[i] == '-' && !isLeft) cnt++; } i++; }}void output(int *arr , int tmpPos){ bool vis[MAXN]; bool isLeft = true; memset(vis , false , sizeof(vis)); for(int i = 0 ; i <= tmpPos ; i++) vis[arr[i]] = true; int tmpArr[MAXN]; int tmpArrPos = 0; for(int i = 0 ; i < pos ; i++) if(!vis[i]) tmpArr[tmpArrPos++] = i; tmpArrPos--; printf("%d" , num[arr[tmpPos--]]); for(int i = 1 ; i < pos ; i++){ if(expStr[i] == '+'){ if(isLeft) printf(" + %d" , num[arr[tmpPos--]]); else printf(" + %d" , num[tmpArr[tmpArrPos--]]); } else if(expStr[i] == '-'){ if(!isLeft) printf(" - %d" , num[arr[tmpPos--]]); else printf(" - %d" , num[tmpArr[tmpArrPos--]]); } else{ isLeft = false; printf(" = %d" , num[tmpArr[tmpArrPos--]]); } } printf("\n");}void solve(){ int tmpNum = (1<<pos)-1; int arr[MAXN]; sum >>= 1; while(tmpNum){ int tmp = tmpNum; int tmpCnt = -1; int tmpPos = pos-1; int tmpSum = 0; while(tmp){ if(tmp&1){ tmpCnt++; arr[tmpCnt] = tmpPos; tmpSum += num[tmpPos]; } tmpPos--; tmp >>= 1; if(tmpSum > sum || tmpCnt+1 > cnt) break; } if(tmpCnt+1 == cnt && tmpSum == sum){ output(arr , tmpCnt); return; } tmpNum--; } printf("no solution\n");}int main(){ while(gets(inStr)){ init(inStr); if(sum&1)//如果是奇数 printf("no solution\n"); else solve(); } return 0;}
- uva 10317 - Equating Equations
- uva 10317 Equating Equations
- UVa:10317 Equating Equations
- uva 10317 - Equating Equations(dfs)
- UVA 10317 - Equating Equations (背包)
- UVA 10317 - Equating Equations 贪心 dfs
- 【UVA】10317 - Equating Equations(dfs + 剪枝)
- UVa 10317 - Equating Equations(DFS)
- UVA 10317 Equating Equations (状态压缩)
- 10317 - Equating Equations
- 10317 - Equating Equations
- UVa 10317 Equating Equations 解题报告(暴力)
- UVA - 10317 Equating Equations(普通的暴力枚举 dfs枚举 c(n,m))
- UVA10317- Equating Equations(回溯+剪枝)
- UVa 11565 - Simple Equations
- uva 10367 - Equations(模拟+数论)
- UVA 10367 - Equations(数论+模拟)
- Equations
- java 遍历map 方法 集合 jackey
- AMD将要嫁他人?
- C++拷贝构造函数详解
- 执行mount命令时找不到介质或者mount:no medium found的解决办法
- 整洁的UML图如何绘制?
- uva 10317 Equating Equations
- 面试题基础1
- JDBC封装
- linux 服务器常用命令
- linux-2.6.32在mini2440开发板上移植(1)之移植Nand驱动并修改分区信息
- 漫谈职业规划九讲
- J2EE应用部署
- APACHE配置相关记录
- IOS多线程编程系类