10.3天梯赛补题报告

7-9 排座位 
 

布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。

输入格式:

输入第一行给出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;
}
View Code
 
7-11 重排链表 
 

给定一个单链表 L1​​→L2​​→⋯→Ln1​​→Ln​​,请编写程序将链表重新排列为 Ln​​→L1​​→Ln1​​→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;
}
 
View Code
原文地址:https://www.cnblogs.com/nanan/p/13766644.html