UVa 725 Division

原创 2016年06月01日 00:25:53


来源:《算法竞赛入门经典(第二版)》例题7-1、UVa 725

题目分析:
UVa题目惯例小心输出格式。这个题是简单的整数枚举。联系 UVa 10976可以发现枚举也是有技巧的,往往只需部分枚举,其他不定元可以通过部分枚举的值推算出来,这道题就是如此。题意本身非常简单了,给一个整数n,求0~9五五分的两个整数u、v,使得成立u / v = n
事先准备好v的所有可能情况A510种,这是因为枚举v推u只涉及乘法不用关心整除这个麻烦事。得到u、v后检验是否合法即可。
题外话,这个题一开始用c++11特性和字符串处理胡乱装逼跑了610ms,写这篇博客的时候是在不爽全改成了整数版本,变成跑10ms。我还是跑得快的~

//  Created by wander on 16/6/1.
//  Copyright © 2016年 W4anD0eR96. All rights reserved.
//  UVa725 Division
//  类型:枚举-整数枚举

#include "bits/stdc++.h"
using namespace std;

int n, cnt;
int EnumList[100050], s;
bool Used[10], flag, blank;

void Init(int d) {
  if (d >= 5) { EnumList[cnt++] = s; return; }
  for (int i = 0; i < 10; i += 1) {
    if (Used[i]) continue;
    Used[i] = true;
    s = s * 10 + i;
    Init(d + 1);
    s = s / 10;
    Used[i] = false;
  }
}

void Check(int n, int i) {
  memset(Used, false, sizeof(Used));
  int u = EnumList[i];
  int v = n * u;
  if (v > 98765) return;
  if (v < 10000) Used[0] = true;
  if (u < 10000) { if (Used[0]) return; else Used[0] = true; }
  for (int ucopy = u; ucopy != 0; ucopy /= 10)
    if (Used[ucopy % 10]) return; else Used[ucopy % 10] = true;
  for (int vcopy = v; vcopy != 0; vcopy /= 10)
    if (Used[vcopy % 10]) return; else Used[vcopy % 10] = true;
  flag = true;
  printf("%05d / %05d = %d\n", v, u, n);
}

int main() {
#ifdef DEBUG
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif
  // input and pre-process
  Init(0);
  while (~scanf("%d", &n) && n) {
    // work
    if (!blank) blank = true; else putchar('\n');
    flag = false;
    for (int i = 0; i < cnt; i += 1) Check(n, i);
    if (!flag) printf("There are no solutions for %d.\n", n);
  }
  return 0;
}
//  Created by wander on 16/5/27.
//  Copyright © 2016年 W4anD0eR96. All rights reserved.
//  UVa725 Division
//  类型:枚举-整数枚举

#include "bits/stdc++.h"
using namespace std;

int n, cnt;
string EnumList[100050], s;
bool Used[10], flag, blank;

void Init(int d) {
  if (d >= 5) { EnumList[cnt++] = s; return; }
  for (int i = 0; i < 10; i += 1) {
    if (Used[i]) continue;
    Used[i] = true;
    s.append(1, '0' + i);
    Init(d + 1);
    s.erase(s.end() - 1);
    Used[i] = false;
  }
}

void Check(int n, int i) {
  string u = EnumList[i];
  string v = to_string(n * stoi(u));
  set<char> e;
  if (v.size() > 5) return;
  if (v.size() <= 4) v += "0";
  if (u.size() <= 4) u += "0";
  for (int i = 0, sup = (int)u.size(); i < sup; i += 1)
    if (e.count(u[i])) return; else e.insert(u[i]);
  for (int i = 0, sup = (int)v.size(); i < sup; i += 1)
    if (e.count(v[i])) return; else e.insert(v[i]);
  flag = true;
  printf("%s / %s = %d\n", v.c_str(), u.c_str(), n);
}

int main() {
#ifdef DEBUG
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif
  // input and pre-process
  Init(0);
  while (~scanf("%d", &n) && n) {
    // work
    if (!blank) blank = true; else putchar('\n');
    flag = false;
    for (int i = 0; i < cnt; i += 1) Check(n, i);
    if (!flag) printf("There are no solutions for %d.\n", n);
  }
  return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Uva - 725 - Division

暴力求解,枚举fghij, 然后乘n之后把abcde加上组成一个字符串,如果字符串长度超过10,退出循环。把字符串排序之后应该和字符0123456789一一对应,就成功了。 输入的时候注意要求两行输...

Uva725 Division

题意: 每组测试数据输入一个值n,对于每一个测试数据: 你要从0~9中取数给abcde和fghij每个字母赋值(每个数字用且只能用一次),形成两个数abcde和fghij,如果满足abcde / fg...

Uva 725 Division(简单枚举)

这题算是自己系统学习暴力求解法做的第一道题。总结如下: 1.在付诸于实践之前,将问题进行分析,有利于使暴力求解不单单只是暴力,还有点巧劲。 2.如一道题中有多个对象,要选取合适的对象(如范围好确定...

UVa725 Division(暴力)

UVa725 Division (暴力)

UVa 725 DIVISION 除法

题目描述:    Write a program that finds and displays all pairs of 5-digit numbers that between them use ...

UVA - 725 Division (暴力枚举)

Division  Write a program that finds and displays all pairs of 5-digit numbers thatbetwee...

uva 725 Division

uva 725  Division  Write a program that finds and displays all pairs of 5-digit numbers that ...

UVA_725: Division

Description Write a program that finds and displays all pairs of 5-digit numbers thatbetween them u...

UVA - 725 Division

Division  Write a program that finds and displays all pairs of 5-digit numbers that bet...
  • kun768
  • kun768
  • 2014年12月12日 23:05
  • 416

UVa - 725 - Division(暴力枚举)

#include #include using namespace std; int num1[10]; int num2[10]; // 12345 012345 bool check(int a,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 725 Division
举报原因:
原因补充:

(最多只允许输入30个字)