2020.10.3天梯赛补题

本次比赛暴露了自身很多问题。

1 ,1题我忽略了数据的输入,在数据输入环节出了问题,即如果一个人输了输入终止。我还没有理解好题意,如果同输或同赢就谁都不喝酒。

#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e5+5;
ll a[nl][4];
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main(){
    ll n,m;
    cin>>n;
    cin>>m;
    ll n1=0,mm=0;
    ll t;
    cin>>t;
    while(t--){
        ll a,b,c,d;
        cin>>a>>b>>c>>d;
        if(b==a+c&&d!=a+c){
            n--;
            n1++;
            if(n==-1){
                cout<<"A"<<endl;
                cout<<mm<<endl;
                break;
            }
        }
        if(d==a+c&&b!=a+c){
            m--;
            mm++;
            if(m==-1){
                cout<<"B"<<endl;
                cout<<n1<<endl;
                break;
            }
        }
    }
}

 9题,这题就是判断两个人的关系,本来想用并查集,但不太熟悉,就定义了一个二维数组存两个人的关系。特别的如果两人敌对再遍历一遍判断两人的关系。注意:敌人的敌人不一定不是朋友(这是很容易忽略的地方)。

#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e5+5;
int al[101][101]={0};
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main(){
   speed_up;
   int n,m,k;
   cin>>n>>m>>k;
   int i;
   for(i=1;i<=m;i++){
        int a,b,c;
    cin>>a;
    cin>>b;
    cin>>c;
    al[a][b]=c;
    al[b][a]=c;
   }
   for(i=1;i<=k;i++){
    int d,e;
    cin>>d;
    cin>>e;
    if(al[d][e]==-1){
            int j;
            int flag=0;
        for(j=1;j<=m;j++){
            if(al[d][j]*al[e][j]==1){
                cout<<"OK but..."<<endl;
                flag=1;
                break;
            }
        }
        if(flag==0){
            cout<<"No way"<<endl;
        }
    }else if(al[e][d]==0){
        cout<<"OK"<<endl;
    }else if(al[e][d]==1){
        cout<<"No problem"<<endl;
    }
   }
}
10 题:
10题不很难,当时敲乱了。字符串为奇数时就单独判断每一个字符两边的字符是否相等,用num记录数目;偶数的话就同时判断两个字符。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
   string a;
   getline(cin,a);
   ll i;
   ll n;
   n=a.size();
   ll sum=0;
   ll z=0;
   if(n==1){
    cout<<1<<endl;
    z=1;
   }
   for(i=1;i<n-1;i++){
    ll q=i-1;
    ll p=i+1;
    ll num=1;
    while(q>=0&&p<=n-1){
            if(a[q]==a[p]){
                num+=2;
        q--;
        p++;
            }else{
            break;
            }
    }
    if(sum<num){
        sum=num;
    }
   }
   for(i=0;i<=n-1;i++){
    ll q=i;
    ll p=i+1;
    ll num=0;
    while(q>=0&&p<=n-1){
            if(a[q]==a[p]){
                num+=2;
        q--;
        p++;
            }else{
            break;
            }
    }
    if(sum<num){
        sum=num;
    }
   }
   if(z==0){
    cout<<sum<<endl;
   }
  }
 11 题:
链表题:
题目很好理解,就是代码不好敲,定义一个结构体,用一个end存排序最后的数,其他的就是敲代码了,这里面的逻辑有些复杂。
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+5;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
struct point{
    string num;
    ll next;
    ll front;
}points[N];
int main(){
    ll Head;
    ll n;
    cin>>Head>>n;
    ll End;
    ll i;
    for(i=0;i<n;i++){
        int head,next;
        string num;
        cin>>head>>num>>next;
        points[head].num=num;
        points[head].next=next;
        if(next!=-1){
            points[next].front=head;
        }else{
            End=head;
        }
    }
    while(Head!=End){
      printf("%05d ", End);
      cout<<points[End].num;
      printf(" %05d\n", Head);
      End=points[End].front;
      if(Head==End){
          break;
      }
       printf("%05d ", Head);
      cout<<points[Head].num;
       printf(" %05d\n", End);
      Head=points[Head].next;
    }
    printf("%05d ", Head);
    cout<<points[Head].num;
    cout<<" -1"<<endl;
    return 0;
}
12 题:
这个题其实就是删数看最后能不能根据打下的城池将题中给出的总城池都删掉。直接循环会超时,就用了set。
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e4+5;
ll a[nl][2];
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main(){
   speed_up;
   ll n,m;
   cin>>n;
   cin>>m;
   ll i;
   for(i=0;i<m;i++){
    cin>>a[i][0];
    cin>>a[i][1];
   }
   ll k;
   cin>>k;
   ll j;
   while(k--){
    ll ok=0;
    set<int>s;
    ll t;
    cin>>t;
    for(j=0;j<t;j++){
        ll q;
        cin>>q;
        s.insert(q);
    }
    for(i=0;i<m;i++){
        if(s.find(a[i][0])==s.end()&&s.find(a[i][1])==s.end()){
            ok=1;
            break;
        }
    }
    if(ok==1){
        cout<<"NO"<<endl;
    }else if(ok==0){
        cout<<"YES"<<endl;
    }
   }
}
 

 

posted @ 2020-10-09 17:18  yyscn  阅读(133)  评论(0)    收藏  举报