• 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
  • 相关阅读:
    穷举
    菱形
    docker安装cloudera manager,切换cloudera-scm用户报错can not open session
    修改cloudera manager的端口号
    postgresql拓展if、ifnull、group_concat函数
    clion调试postgresql
    Java面向切面原理与实践
    Spring-boot非Mock测试MVC,调试启动tomcat容器
    spring-cloud-feign 使用@RequetParam报错QueryMap parameter must be a Map: class java.lang.String
    linux虚拟机拓展大小
  • 原文地址:https://www.cnblogs.com/nanan/p/13766644.html
Copyright © 2020-2023  润新知