请相信,这是一道水题,读了一周的题意

题意:

题目里面描述的那三个条件可以直接无视,关于罗马数字只要知道一个规则即可,映射如下

I 1         V 5
X 10      L 50
C 100    D 500
M 1000

如果一个字母映射的数字比后一个字母映射的数字小,当前的数字就作为负数.

MXMIII = 1000-10+1000+1+1+1=1993

输入的全是合法的罗马数字,问的问题有俩个,

在罗马数字编码中,s1+s2是否等于s3,如果相等输出Correct,要不然输出Incorrect

在阿拉伯数字编码中s1+s2是否等于s3,

罗马数字到阿拉伯数字编码规则,对于一个罗马数字中字母映射到0-9,当然,阿拉伯数字不能是前导0开头

AC:30ms

#include<stdio.h>
#include<iostream>
#include<queue>
#include<map>
#include<memory.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
using namespace std; string valid = "valid";
string impossible = "impossible";
string ambiguous = "ambiguous";
string correct = "Correct";
string incorrect = "Incorrect";
int t[];
int total = ;
int vis[];
int val[];
char str[];
int length;
int endLength = ;
char eqAfterChar;
int sum1 = , sum2 = ;
void table()
{
t['I' - 'A'] = ;
t['X' - 'A'] = ;
t['C' - 'A'] = ;
t['M' - 'A'] = ;
t['V' - 'A'] = ;
t['L' - 'A'] = ;
t['D' - 'A'] = ;
} void dfs(int cur, int sum)
{
if(total == )
return;
if(cur == length)
{
if(sum1+sum2 == sum)
total++;
return;
}
char c = str[cur];
if(c == '=')
{
sum2 = sum;
sum=;
++cur;
c = str[cur];
}
else if(c == '+')
{
++cur;
c = str[cur];
sum1 = sum;
sum = ;
} if(vis[c - 'A'] == -)
{
int i = ;
if(c == eqAfterChar && endLength != )
i = ;
for(; i < ; i++)
{
if(val[i])
continue;
val[i] = ;
sum = sum * + i;
vis[c - 'A'] = i;
dfs(cur + , sum);
sum = (sum-i) / ;
vis[c - 'A'] = -;
val[i] = ;
}
}
else
{
sum = sum * + vis[c - 'A'];
dfs(cur + , sum);
sum = sum / - vis[c - 'A'];
}
} int main(const int argc, char** argv)
{
freopen("d:\\1.txt", "r", stdin);
table();
while (scanf("%s", str))
{
if(str[] == '#')
return ;
total = ;
sum1 = , sum2 = ;
memset(vis, -, sizeof(vis));
memset(val, , sizeof(val));
length = strlen(str);
int t1 = ;
int k = ; for(int i = length - ; i >= ;)
{
if(str[i] == '=' || str[i] == '+')
{
if(str[i] == '=')
eqAfterChar = str[i + ];
k = -;
--i;
continue;
}
if(i != && str[i - ] != '=' && str[i - ] != '+')
{
if(t[str[i] - 'A'] > t[str[i - ] - 'A'])
t1 = t1 + (t[str[i] - 'A'] - t[str[i - ] - 'A']) * k;
else
t1 = t1 + (t[str[i] - 'A'] + t[str[i - ] - 'A']) * k; --i;
}
else
t1 += t[str[i] - 'A'] * k;
if(k == )
endLength++;
--i;
}
if(t1 == )
cout << correct;
else
cout << incorrect;
dfs(, );
if(total == )
cout << " " << impossible << endl;
else if(total == )
cout << " " << valid << endl;
else
cout << " " << ambiguous << endl;
}
return ;
}

uva-185-暴力枚举的更多相关文章

  1. uva 11088 暴力枚举子集/状压dp

    https://vjudge.net/problem/UVA-11088 对于每一种子集的情况暴力枚举最后一个三人小组取最大的一种情况即可,我提前把三个人的子集情况给筛出来了. 即 f[S]=MAX{ ...

  2. UVA 185(暴力DFS)

      Roman Numerals  The original system of writing numbers used by the early Romans was simple but cum ...

  3. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  4. UVA 10012 How Big Is It?(暴力枚举)

      How Big Is It?  Ian's going to California, and he has to pack his things, including his collection ...

  5. UVA - 11464 Even Parity 【暴力枚举】

    题意 给出一个 01 二维方阵 可以将里面的 0 改成1 但是 不能够 将 1 改成 0 然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求 ...

  6. 紫书 例题 10-2 UVa 12169 (暴力枚举)

    就是暴力枚举a, b然后和题目给的数据比较就ok了. 刘汝佳这道题的讲解有点迷,书上讲有x1和a可以算出x2, 但是很明显x2 = (a * x1 +b) 没有b怎么算x2?然后我就思考了很久,最后去 ...

  7. UVA 725 UVA 10976 简单枚举

    UVA 725 题意:0~9十个数组成两个5位数(或0开头的四位数),要求两数之商等于输入的数据n.abcde/fghij=n. 思路:暴力枚举,枚举fghij的情况算出abcde判断是否符合题目条件 ...

  8. CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution (暴力枚举)

    题意:求定 n 个数,求有多少对数满足,ai^bi = x. 析:暴力枚举就行,n的复杂度. 代码如下: #pragma comment(linker, "/STACK:1024000000 ...

  9. 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)

    /* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...

  10. HNU 12886 Cracking the Safe(暴力枚举)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274 解题报告:输入4个数 ...

随机推荐

  1. flask第30篇——宏macro和import标签

    宏是Jinja2特有的,像Django则没有这个. 先新建一个项目macroDemo: 然后在templates文件夹中新建index.html文件,并在代码中返回渲染后的文件: 然后回到index. ...

  2. grandstack 基于graphql&&react&& apollo&& neo4j 的全栈开发工具

    grandstack是一个基于graphql&&react&& apollo&& neo4j 的全栈开发工具. 有篇关于graphql 的5个常见问题的 ...

  3. oracle for in 学习

    oracle for  in 是对于进行循环的数据处理时比较方便的 因为我们平时的操作经常会碰到进行循环的数据操作 以下为建立的例子 1. begin for item in 2..10 loop d ...

  4. tomcat catalina.out切割脚本

    shell脚本catalina.out 切割脚本...每天23.30切割.删除七天之前的日志这里3个tomcat实例(1)拷贝日志文件(2)清空日志文件*只能清空如果删除tomcat不重启不会生成新的 ...

  5. 如何生成SPFILE文件

    1.spfile是Oracle9i之后引入的,目的是提高系统安全性.在Oracle8i下初始化参数文件为文本文件,可以使用文本编辑器进行编辑,当需要修改初始化参数时,需要在init.ora文件中修改, ...

  6. 洛谷2530(codevs2098)化工厂装箱员

    题目:https://www.luogu.org/problemnew/show/P2530 dp或搜索. dp做法就是 当前值+1 转移到 当前某一维为0.位置前进了c位 的地方.但没写. 写了搜索 ...

  7. POJ1742Coins

    题目:http://poj.org/problem?id=1742 可以正常地多重背包.但是看了<算法竞赛入门经典>,收获了贪心的好方法. 因为这里只需知道是否可行,不需更新出最优值之类的 ...

  8. oracle常用数据类型说明

    类型 含义 存储描述 备注 CHAR 固定长度字符串 最大长度2000bytes VARCHAR2 可变长度的字符串, 最大长度4000bytes 可做索引的最大长度749 NCHAR 根据字符集而定 ...

  9. 动态爬虫——selenium2搭载phantomjs入门范例

    这是我学习爬虫比较深入的一步了,大部分的网页抓取用urllib2都可以搞定,但是涉及到JavaScript的时候,urlopen就完全傻逼了,所以不得不用模拟浏览器,方法也有很多,此处我采用的是sel ...

  10. 实验三:C分支结构程序设计

    3.1 #include<stdio.h> int main(){ char a; scanf("%c",&a); if(a>=65&&a ...