Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴份c++暴搜AC代码,要找到合适的搜索方式//此方法对于位数为偶数的情况会做额外的一倍运算次数,可考虑使用另外的 flag 对偶数情况进行处理,防止重复搜索对称的情况 #include <iostream> using namespace std; int ans, len1, len2; bool flag[10]; void getresult1(int length, int q); void getresult2(int length, int &q, int a); int main() { int n, len; char c[50]; cin >> n; cin.get(); for (int so = 0; so < n; so++) { for (int i = 0; i < 10; i++) { flag[i] = false; } ans = 2 << 29;//先将 ans 设为一个足够大的数 len = 0; cin.getline(c, 50); for (int i = 0; i < 50; i++) { if ((c[i] >= 48) && (c[i] <= 57)) { flag[c[i] - 48] = true; len++; } if (!c[i]) { break; } } //结果一定是位数相同或相差一位的两个数的差 len1 = len >> 1;//让第一个数的位数不大于第二个数,以减少对 0 的判断次数 len2 = len - len1; getresult1(0, 0); cout << ans << '\n'; } return 0; } void getresult1(int length, int q) { if (length == len1) { getresult2(0, q, 0); } else { int i = 0; if ((!length) && (len1 > 1)) { i = 1; } for (; i < 10; i++) { if (flag[i]) { flag[i] = false; getresult1(length + 1, q * 10 + i); flag[i] = true; } } } return; } void getresult2(int length, int &q, int a) { if (length == len2) { if (a > q)//分正负 { if ((a - q) < ans) { ans = a - q; } } else { if ((q - a) < ans) { ans = q - a; } } } else { int i = 0; if (!length) { i = 1; } for (; i < 10; i++) { if (flag[i]) { flag[i] = false; getresult2(length + 1, q, a * 10 + i); flag[i] = true; } } } return; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator