1 条题解
-
1
题目分析
题意简述
本题包含 组测试用例。对于每组测试用例,输入整数 表示有 组数据,每组数据包含三个整数 、、 和两个字符 、。程序需要根据这些数据构建某种逻辑关系,找出其中可能存在的错误(
kywh
为false
的情况),并根据错误的数量判断输出结果。如果错误数量不为 ,输出impossible
;如果错误数量为 ,输出特定的数值(通过fanIdx[arg]
得到)。输入
- 第一行输入测试用例的组数 。
- 对于每组测试用例:
- 首先输入整数 ,表示接下来有 组数据。
- 对于每组数据,依次输入整数 、整数 、字符 、整数 、字符 。
输出
对于每组测试用例:
- 如果错误数量(
huai
)不为 ,输出字符串impossible
。 - 如果错误数量(
huai
)为 ,输出通过fanIdx[arg]
得到的数值。
解题思路
数据处理与编号映射
- 映射表初始化:使用
map<int, int> idx
来建立输入整数到自定义编号的映射,fanIdx
数组用于反向映射(从自定义编号到输入整数),cnt
用于记录自定义编号的数量,初始化为 。 - 获取编号函数
getID
:定义getID
函数,用于获取输入整数对应的自定义编号。如果整数已经在映射表中,则直接返回对应的编号;否则,将整数插入映射表,更新fanIdx
数组,并返回新的编号。
数据存储与初步分析
- 数据存储:对于每组输入数据,通过
getID
函数获取 、、 对应的自定义编号ida
、idb
、idc
。将idb
和idc
存储在test[ida][0]
和test[ida][1]
中,将f1
和f2
转换为布尔值存储在res[ida][0]
和res[ida][1]
中。 - 记录可能错误的编号:如果
res[ida][0]
为false
且idb
未被使用过,则将idb
加入posN
数组,并标记idb
已使用;同理,如果res[ida][1]
为false
且idc
未被使用过,则将idc
加入posN
数组,并标记idc
已使用。
错误检查与结果判断
- 检查错误:遍历
posN
数组中的每个编号idh
。对于每个idh
,检查其他所有编号j
的数据,判断是否存在逻辑矛盾(即(res[j][0] && test[j][0]==idh) || (!res[j][0] && test[j][0]!=idh)
或(res[j][1] && test[j][1]==idh) || (!res[j][1] && test[j][1]!=idh)
成立)。如果存在矛盾,则kywh
设为false
并跳出循环。 - 统计错误数量并输出结果:如果
kywh
为true
,则错误数量huai
加 ,并记录当前编号arg
。如果huai
达到或超过 ,则跳出循环。最后,根据huai
的值判断输出impossible
还是fanIdx[arg]
的值。
代码实现
#include <iostream> #include <stdio.h> #include <map> #include <vector> using namespace std; int cnt; map<int, int> idx; int fanIdx[233]; int test[233][2]; int res[233][2]; int getID(int yid){ map<int, int>::iterator it = idx.find(yid); if(it != idx.end()){ return it->second; } idx.insert(pair<int, int>(yid, cnt)); fanIdx[cnt] = yid; cnt++; return cnt-1; } int main() { int t; scanf("%d", &t); for(int ii = 0; ii < t; ii++){ int n; scanf("%d", &n); idx.clear(); cnt = 0; vector<int> posN; int used[233] = {0}; for(int i = 0; i < n; i++){ int a,b,c; char f1,f2; scanf("%d\n%d\n%c\n%d\n%c", &a, &b, &f1, &c, &f2); int ida = getID(a), idb = getID(b), idc = getID(c); test[ida][0] = idb, test[ida][1] = idc; res[ida][0] = (f1=='Y'), res[ida][1] = (f2=='Y'); if(!res[ida][0]){ if(!used[idb]) posN.push_back(idb); used[idb]++; } if(!res[ida][1]){ if(!used[idc]) posN.push_back(idc); used[idc]++; } } int huai = 0; int arg = -1; int sz = posN.size(); for(int i = 0; i < sz; i++){ int idh = posN[i]; bool kywh = 1; for(int j = 0; j < cnt; j++){ if(j==idh) continue; if((res[j][0] && test[j][0]==idh) || (!res[j][0] && test[j][0]!=idh)){ kywh=0; break; } if((res[j][1] && test[j][1]==idh) || (!res[j][1] && test[j][1]!=idh)){ kywh=0; break; } } if(kywh){ huai++; arg=idh; if(huai>=2) break; } } if(huai-1){ printf("impossible\n"); } else{ printf("%d\n", fanIdx[arg]); } } return 0; }
代码说明
- 全局变量定义:
cnt
用于记录自定义编号的数量。idx
是一个map
,用于建立输入整数到自定义编号的映射。fanIdx
数组用于反向映射,从自定义编号到输入整数。test
二维数组用于存储每组数据中后两个数对应的编号。res
二维数组用于存储每组数据中两个字符转换后的布尔值。
getID
函数:实现输入整数到自定义编号的映射功能。main
函数:- 读取测试用例的组数 。
- 对于每组测试用例,读取数据数量 ,清空
idx
映射表,初始化cnt
和其他相关数组。 - 读取每组数据,进行编号映射和数据存储,并记录可能错误的编号。
- 检查可能错误的编号,统计错误数量,根据错误数量输出相应结果。
- 1
信息
- ID
- 360
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者