2020.10.10天梯赛补题

总结:前两个小时不要看排名,先做自己一看就会的,每个题都要看一下,避免落题。

1题;

相当考验人的字符串水平。

#include<string>
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
int main()
{
    int n,i;
    cin>>n;
    getchar();
    string s;
    vector<string>b;//每个元素都是字符串类型数组;
    while(n--){
        //cout<<n<<endl;
        getline(cin,s);
        cout<<s<<endl<<"AI: ";
        //cout<<"AI: ";
        //cout<<m<<endl;
        for(i=0;i<s.size();i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                if(s[i]!='I')s[i]+=32;
            }
            else if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z'))continue;
            else if(s[i]!=' ')//排除字母和数字后当为标点符号时
            {
                s.insert(i," ");//在标点符号前插入空格,便于找出独立性的单词
                i++;
            }
            if(s[i]=='?')s[i]='!';
        }
        string temp="";
        //int q=0;
        for(i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
            {
                temp+=s[i];
            }
            else
            {
                if(temp!=""){
                    b.push_back(temp);//将单词或者数字依次存储在b中;
                    temp="";
                }
                //cout<<b[q]<<"*"<<endl;
                //q++;
            }
        }
       // cout<<q<<endl;
        if(temp!="")b.push_back(temp);//存储第m-1个
        //int w=b.size();
        //cout<<w<<endl;
        for(int j=0;j<b.size();j++)
        {
            if(b[j]=="I"||b[j]=="me")b[j]="you";
            else if(b[j]=="can"||b[j]=="could")
            {
                if((j+1)<b.size())
                {
                    if(b[j+1]=="you")
                    {
                        b[j+1]=b[j];
                        b[j]="I";
                        //b[i+1]=
                    }
                }
            }
        }
        for(i=0;i<b.size();i++)
        {
            cout<<b[i];
            if(i==b.size()-1)break;
            if((b[i+1][0]>='0'&&b[i+1][0]<='9')||(b[i+1][0]>='a'&&b[i+1][0]<='z')||b[i+1][0]=='I')
            {
               printf(" ");
            }
        }
       printf("\n");
        //cout<<n<<endl;
        b.clear();//清空数组b
    }
    return 0;
}

3题:

题意很好理解,注意分情况,但输入要用scanf否则会浮点错误。

#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
int main(){
   ll t;
   cin>>t;
   ll x,y;
   ll al=0,bl=0;
   ll a,b;
   while(t--){
   scanf("%lld/%lld",&a,&b);
    if(al!=0){
     x=al*b+a*bl;
     y=bl*b;
    }else{
    x=a;
    y=b;
    }
    ll m;
    m=__gcd(x,y);
    x/=m;
    y/=m;
    al=x;
    bl=y;
   }
   if(x!=0&&x/y==0){
    cout<<x<<"/"<<y<<endl;
   }else if(x%y==0){
   cout<<x/y<<endl;
   }else{
    cout<<x/y<<" "<<x%y<<"/"<<y<<endl;
   }
}
 9题:
9题很好理解,一步一步做即可。关于按账号的字母序升序输出只用a[i]>a[j]即可(string类型)
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e5+5;
string a[10001];
ll b[10001];
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main(){
   speed_up;
   int n,g,k;
   cin>>n;
   cin>>g;
   cin>>k;
   int i,j;
   for(i=0;i<n;i++){
    cin>>a[i];
    cin>>b[i];
   }
   ll temp=0;
   string temp1;
   temp1=a[0];
   for(i=0;i<n;i++){
    for(j=i+1;j<n;j++){
        if(b[i]<b[j]){
            temp=b[j];
            b[j]=b[i];
            b[i]=temp;
            temp1=a[j];
            a[j]=a[i];
            a[i]=temp1;
        }
    }
   }
   ll kl=k;
   for(i=k-1;i<n;i++){
        if(b[i]==b[i+1]){
            kl++;
        }else{
        break;
        }
   }
   k=kl;
   for(i=0;i<k;i++){
    if(b[i]==b[i+1]){
        for(j=i+1;j<k;j++){
                if(b[i]!=b[j]){
                    break;
                }
           
           
                if(a[i]>a[j]){
                    temp=b[j];
            b[j]=b[i];
            b[i]=temp;
            temp1=a[j];
            a[j]=a[i];
            a[i]=temp1;
                }
            }
       
    }
    }
    j=1;
    ll dll=0;
    for(i=0;i<n;i++){
        if(b[i]>=g){
            dll+=50;
        }else if(b[i]>=60){
            dll+=20;
        }
    }
    cout<<dll<<endl;
    ll jl=1;
    for(i=0;i<k;i++){
        cout<<j<<" "<<a[i]<<" "<<b[i]<<endl;
        if(b[i]==b[i+1]){
            jl++;
        }else{
        j=j+jl;
        jl=1;
        }
    }
}
 10题:
 
这个题逻辑有些复杂,用到了mesent和abs。
#include<bits/stdc++.h>
using namespace std;
struct node{
 int key;
 int next;
};
node a1[100005];
int a2[100005],a3[100005];
bool flag[100005];
int main(){
 int m,n;
 cin>>m>>n;
 int addr,key,next;
 for(int i=0;i<n;i++){
  cin>>addr;
  cin>>a1[addr].key;
  cin>>a1[addr].next;
 } 
 memset(flag,true,sizeof(flag));
 int k1=0,k2=0;
 for(int i=m;i!=-1;i=a1[i].next){
  int q = abs(a1[i].key);
  if(flag[q]){
   flag[q] = false;
   a2[k1++] = i;
  }
  else{
   a3[k2++] = i;
  }
 }
 printf("%05d %d ",a2[0],a1[a2[0]].key);
 for(int i=1;i<k1;i++){
  printf("%05d\n",a2[i]);
  printf("%05d %d ",a2[i],a1[a2[i]].key);
 }
 printf("-1\n");
 if(k2){
  printf("%05d %d ",a3[0],a1[a3[0]].key);
  for(int i=1;i<k2;i++){
   printf("%05d\n",a3[i]);
   printf("%05d %d ",a3[i],a1[a3[i]].key);
  }
  printf("-1\n");
 }
 return 0;
}
11题
 
朋友以及朋友的朋友即在同一个部落,判断社区多少人,以及多少个部落。
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int n,q;
const int N=1e4+100;
int p[N];
int find(int x){
    if(p[x]!=x){
        p[x]=find(p[x]);
    }
    return p[x];
}
set<int>st;
int main(){
    for(int i=1;i<=N-10;i++){
        p[i]=i;
    }
    cin>>n;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a;
        a--;
        cin>>b;
        st.insert(b);
        int fa=find(b);
        while(a--){
            cin>>b;
            st.insert(b);
            int fb=find(b);
            if(fb!=fa){
                p[fb]=fa;
            }
        }
    }
    int cnt=0;
    for(auto &x:st){
        if(p[x]==x){
            cnt++;
        }
    }
    cin>>q;
    cout<<st.size()<<' '<<cnt<<endl;
    while(q--){
        int a,b;
        cin>>a>>b;
        if(find(a)==find(b)){
            cout<<'Y'<<endl;
        }
        else{
            cout<<'N'<<endl;
        }
    }
    return 0;
}
12 题
这题不难,只是没时间了。
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e5+5;
double a[1001];
double b[1001];
double c[1001];
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main(){
   speed_up;
   ll n;
   cin>>n;
   ll d;
   cin>>d;
   ll i;
   for(i=0;i<n;i++){
    cin>>a[i];
   }
   for(i=0;i<n;i++){
    cin>>b[i];
   }
   for(i=0;i<n;i++){
    c[i]=b[i]*1.0/a[i];
   }
   ll sum=0,j;
   for(i=0;i<n;i++){
    for(j=i+1;j<n;j++){
        if(c[i]<c[j]){
            ll temp;
            temp=c[i];
            c[i]=c[j];
            c[j]=temp;
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            temp=b[i];
            b[i]=b[j];
            b[j]=temp;
        }
    }
   }
   double num=0;
   for(i=0;i<n;i++){
    if(sum<d){
        if((sum+a[i])<=d){
            sum+=a[i];
            num+=1.0*b[i];
        }else{
            num+=1.0*(d-sum)*c[i];
            sum=d;
        }
    }else{
      break;
    }
   }
   printf("%.2lf",num);
}
 
posted @ 2020-10-18 19:51  yyscn  阅读(93)  评论(0)    收藏  举报