PAT (Basic Level) Practice (中文)1090 危险品装箱(C语言)

程序员入门水平,贴出代码大家一起进步!

题目

集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。

本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。

输入格式:

输入第一行给出两个正整数:N (≤10^4) 是成对的不相容物品的对数;M (≤100) 是集装箱货品清单的单数。

随后数据分两大块给出。第一块有 N 行,每行给出一对不相容的物品。第二块有 M 行,每行给出一箱货物的清单,格式如下:

K G[1] G[2] … G[K]
其中 K (≤1000) 是物品件数,G[i] 是物品的编号。简单起见,每件物品用一个 5 位数的编号代表。两个数字之间用空格分隔。

输出格式:

对每箱货物清单,判断是否可以安全运输。如果没有不相容物品,则在一行中输出 Yes,否则输出 No。

输入样例:

6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006
4 00001 20004 00002 20003
5 98823 20002 20003 20006 10010
3 12345 67890 23333
输出样例:

No
Yes
Yes

思路||总结

  1. 将不相容的数据输入,将数据两次存放, 即在A中存放每对数据的第一个和第二个, 同时在B中存放每对数据得到第二个和第一个,然后先按照A中关键字升序排序,当A中关键字相同时按照B中关键字升序排序。
    PAT (Basic Level) Practice (中文)1090 危险品装箱(C语言)_第1张图片
  2. 对于每辆车的数据生序排序,设置指针 P,h,r,P指向上表,h指向一辆车排序好的数据,从1号遍历到倒数第二个,r开始时候指向h的下一个节点进行遍历。通过一次遍历确定一辆车是否有违规物品。

AC代码

#include 
#include 
typedef struct//存放一对不相容的物品。 
	{
	int a;
	int b;
	}node;
int main()
	{
	int comp(const void*a,const void *b);
	int flag(const void*a,const void *b);
	int i,j,N,M;
	scanf("%d %d",&N,&M);
	node num[2*N];//设置输入数据的两倍空间。 
	for(i=0;ia<*h)P++;
			if(P->a==*h)//确定第一个相同。 
				{
				for(J=I+1;Ja==*h&&P->b<*r)P++;
					if(P->b==*r)flag=1;
					};
				};
			};
		if(flag==1)printf("No\n");
		else printf("Yes\n");
		};
	return 0;
	}
int flag(const void*a,const void *b)
	{
	return *(int*)a-*(int*)b;
	}
int comp(const void*a,const void *b)
	{
	int flag=0;
	if(((node*)a)->a>((node*)b)->a)flag=1;
	else if(((node*)a)->a<((node*)b)->a)flag=-1;
	else if(((node*)a)->b>((node*)b)->b)flag=1;
	else if(((node*)a)->b<((node*)b)->b)flag=-1;
	return flag;
	}

你可能感兴趣的:(PAT,PAT(Basic))