布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。
输入格式:
输入第一行给出3个正整数:N
(≤100),即前来参宴的宾客总人数,则这些人从1到N
编号;M
为已知两两宾客之间的关系数;K
为查询的条数。随后M
行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系
,其中关系
为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K
行,每行给出一对需要查询的宾客编号。
这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。
输出格式:
对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem
;如果他们之间并不是朋友,但也不敌对,则输出OK
;如果他们之间有敌对,然而也有共同的朋友,则输出OK but...
;如果他们之间只有敌对关系,则输出No way
。
输入样例:
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
输出样例:
No problem
OK
OK but...
No way
解题思路:用二维数组记录两个人的关系,当两人是敌对关系时特判是否存在共同的朋友。
ac代码:
#include<bits/stdc++.h> using namespace std; int main(){ int n,m,k,i,a,b,c,x,y; int p[105][105]={0}; cin>>n>>m>>k; for(i=0;i<m;i++){ cin>>a>>b>>c; p[a][b]=c; p[b][a]=c; } for(i=0;i<k;i++){ cin>>x>>y; int f=0; if(p[x][y]==-1||p[y][x]==-1){ for(int j=1;j<=n;j++){ if(p[j][x]*p[j][y]==1){ f=1; break; } } if(f==1){ cout<<"OK but..."<<endl; } else{ cout<<"No way"<<endl; } } else if(p[x][y]==1||p[y][x]==1){ cout<<"No problem"<<endl; } else{ cout<<"OK"<<endl; } } return 0; }
给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→L2→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤)。结点的地址是5位非负整数,NULL地址用−表示。
接下来有N行,每行格式为:
Address Data Next
其中Address
是结点地址;Data
是该结点保存的数据,为不超过1的正整数;Next
是下一结点的地址。题目保证给出的链表上至少有两个结点。
输出格式:
对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例:
00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1
ac代码:
#include<bits/stdc++.h> using namespace std; struct node { int data; int next; }p[100001]; int main() { int i,j,n,be,x,This,Next; int add1[100001];//顺序保存原始地址数据 int add2[100001];//保存重排之后地址数据 int length,k=0; cin>>be>>n;//第一行,首地址和节点数 for(i=0;i<n;i++) { cin>>This>>x>>Next; p[This].data=x; p[This].next=Next; }//输入完成 while(be!=-1)//按节点顺序保存地址数据于add1 { add1[k++]=be; be=p[be].next; } length=k;//有效地址的个数 k=0;//重新开始计数 for(i=0,j=length-1;i<=j;) { if(i==j){ add2[k]=add1[i]; i++; j--; } else { add2[k++]=add1[j--]; add2[k++]=add1[i++]; } } for(i=0;i<length-1;i++)//输出,注意末尾位 { printf("%05d %d %05d ",add2[i],p[add2[i]].data,add2[i+1]); } printf("%05d %d -1 ",add2[length-1],p[add2[length-1]].data); return 0; }