天梯赛 1

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;}
     }

       }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值