天梯賽 1

2020-10-12 13:00:13

7-6 情人節
思路:
1.用while()迴圈
while(cin>>t)
找到第二號點贊者和第十四號點贊者
2.用點贊者的個數列出三種情況
3.注意一定要排除 t = ’ .’ 的情況
輸入t的時候,不要在while()迴圈外面輸入,直接寫在while內部
用 while(cin >> t)(之前寫在外面的時候一直部分正確)

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

int main()
{
 string t;
 string t2,t14;
 int i=0;
 while(cin>>t)
 {
     if(t==".")
     {
        break;
     }
     i++;
     if(i==2)
     {
        t2=t;
     }
     if(i==14)
     {
        t14=t;
     }
 }
 if(i<2)
 {
     cout<<"Momo... No one is for you ..."<<endl;
 }
 else if(i<14)
 {
     cout<<t2<<" is the only one for you..."<<endl;
 }
 else if(i>=14)
 {
     cout<<t2<<" and "<<t14<<" are inviting you to dinner..."<<endl;
 }
}

7-9 排座位
思路:
一開始我是想用vector< string > 來把所有已知的人的朋友和敵人都裝進陣列裡,但是一直改到最後都是部分正確
後來看了隊裡大佬的新思路:
1.定義一個二維陣列 ret[a][b] 來裝a和b的關係就是陣列這個位置對應的值-1或1
2.如果要判斷的這兩個人是敵人
就要遍歷陣列用if(ret[j][a]*ret[j][b]==1)
看他們是否有共同的朋友

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

int ret[101][101]={0};//初始化
int main()
{
    int n,m,k,i,j;
    cin>>n>>m>>k;
    while(m--)
    {
       int a,b;
       int t;
       cin>>a>>b>>t;
       ret[a][b]=t;
       ret[b][a]=t;
    }
    while(k--)
    {
        int a,b;
        cin>>a>>b;
       //敵人
       if(ret[a][b]==-1)
       {
           int flag=0;
           //遍歷,看看有沒有相同的朋友
           for(int j=1;j<=n;j++)
           {
               if(ret[j][a]*ret[j][b]==1)
               {
                   flag=1;
                   break;//有相同的朋友
               }
           }
           if(flag)cout<<"OK but..."<<endl;
           else cout<<"No way"<<endl;
       }
       //朋友和陌生人
       else if(ret[a][b]==0)
       {
           cout<<"OK"<<endl;
       }
       else if(ret[a][b])
       {
            cout<<"No problem"<<endl;
       }
    }

}

7-11 重排連結串列
思路:
這個用結構體就可以做,之前用指標做過一個很類似的題
1.定義一個結構體,裡面有對應的值,和前面一個數和後面一個數的位置
2.按要求順序輸出的時候可以通過最頭上的Head和最末尾的End來遍歷整個陣列從而輸出,輸出的時候要注意先輸出後面指向的,再輸出前面指向的
3.輸出的時候
可以用:printf(" %05d\n", Head);(有規定的寬度而且可以補0)
不能用:cout<<setw(5)<<Head<<endl;(會有規定的寬度但是不會補0)

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

const int N = 100000 + 5;
//定義一個結構體
struct point
{
    string num;
    int next;
    int front;
}points[N];


int main()
{
    int Head;//頭
    int n;
    cin>>Head>>n;
    int End;//尾
    //輸入
    for(int i=0;i<n;i++)
    {
        int head,next;
        string num;
        cin>>head>>num>>next;
        points[head].num=num;
        points[head].next=next;
        //判斷是否是最後一個值End
        if(next!=-1)
        {
            points[next].front=head;
        }
        else
        {
            End=head;
        }
    }
    //開始從新排序後輸出
    //移動Head和End指標
    while(Head!=End)
    {
      //先輸出後一個
      //cout<<setw(5)<<End<<" ";
      printf("%05d ", End);
      cout<<points[End].num;
     // cout<<setw(5)<<Head<<endl;
      printf(" %05d\n", Head);
      //改變End值
      End=points[End].front;
      if(Head==End)
      {
          break;
      }
      //再輸出第一個
      //cout<<setw(5)<<Head<<" ";
       printf("%05d ", Head);
      cout<<points[Head].num;
      //cout<<setw(5)<<End<<endl;
       printf(" %05d\n", End);
      //改變Head值
      Head=points[Head].next;
    }
    //cout<<setw(5)<<Head<<" ";
    printf("%05d ", Head);
    cout<<points[Head].num;
    cout<<" -1"<<endl;
    return 0;

}

7-12 分而治之
思路:
大體就是看攻下了要攻下的那些城市之後,每個城市是不是都是孤立的
1.把相互之間有路的城市存入陣列
2.把要攻下的城市存入set
3.在set之中尋找陣列中的值,只要成對的裡面有一個在set之中這條路就斷了,所以如果陣列中的值全部在set裡就Yes,否則就No

#include<bits/stdc++.h>
#include<algorithm>
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const long long N=1e4+7;

long long city[N][2];
int main()
{
    long long n,m,i;
    cin>>n>>m;
    //輸入
    //把相互之間有路的城市存入
    for(i=0;i<m;i++)
    {
        cin>>city[i][0];
        cin>>city[i][1];
    }
    long long k,j;
    cin>>k;
    while(k--)
    {
        int flag=0;
        set<int> s;
        //也可以用vector<int>
        long long t;
        cin>>t;
        for(i=0;i<t;i++)
        {
            long long c;
            cin>>c;
            s.insert(c);
        }
        //在s裡找陣列裡的各個值
        //成對存在的只要有一個有就可以了
        for(i=0;i<m;i++)
        {
         if(s.find(city[i][0])==s.end()&&s.find(city[i][1])==s.end())
         {
            flag=1;
            break;
         }
         }
         if(flag==1){cout<<"NO"<<endl;}
         else if(flag==0){cout<<"YES"<<endl;}
     }

       }