PTA-乙级-1090 危险品装箱
1090 危险品装箱
原题链接
思路:
1. 用一个struct数组表示不相容的清单,用一个字符串数组表示待检查的货物;
2. 对字符串数组中的元素(即货物)在strct数组中遍历,如果发现相同的元素,再对字符串中剩下的元素遍历,找是否有struct中配对的另外一个元素。
结果:
通过三个测点,有一个测点超时。
代码(请求改进)
#include<string.h>
#include<iostream>
using namespace std;
const int MAXN = 10050;
struct C
{//存放不相容的物品编号
char a[10];
char b[10];
}cpl[MAXN];
int main()
{
int N, M;
cin >> N >> M;
for (int i = 0; i < N; i++)
//scanf_s("%s %s", &cpl[i].a, &cpl[i].b);
cin >> cpl[i].a >> cpl[i].b;
/*读入集装箱M, 并做判断和输出*/
while (M-- > 0)
{
int K, i = 0;
cin >> K; //物品件数
char good[1005][10];
while (K-- > 0) //读入物品
//scanf_s("%s", &good[i++]);
cin >> good[i++];
K = i;
/*search-judge*/
int flag = 0;
char *p;
struct C *temp;
for (i = 0; i < K && flag != 1; i++)
{
p = good[i];
for (int j = 0; j < N && flag != 1; j++)
{//在不相容的清单里面搜索
temp = &cpl[j];
if (strcmp(temp->a, p) == 0)
{ //找到了物品,在剩下的物品里面搜索是否有配对的不相容的物品
for (int k = i + 1; k < K; k++)
if (strcmp(temp->b, good[k]) == 0)
{
flag = 1;
break; //找到不相容的,跳出
}
}
else if (strcmp(temp->b, p) == 0)
{
for (int k = i + 1; k < K; k++)
if (strcmp(temp->a, good[k]) == 0)
{
flag = 1;
break; //找到不相容的,跳出
}
}
else;
}
}
flag? cout << "No\n" : cout << "Yes\n";
}
return 0;
}
// 一小时-18分