2020.10.10天梯赛练习

题目:估值一亿的AI核心代码

思路:

这个题就是耐心的按照题目模拟就是了,还有一些格式需要注意,我是先将字符串改成小写,顺便进行了分割标点符号和其他符号,然后遍历分割单词存入字符串数组,后面再进行特殊单词单独变化,最后按照要求输出就行。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 1e5 + 4;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)


vector<string> vs;
int main(){

    int n;
    cin >> n;
    getchar();
    while(n--){

        string s;
        getline(cin,s);
        cout <<  s << endl;
        cout << "AI: ";
        for(int i = 0;i < s.size();i++){
            if(s[i] >= 'A' && s[i] <= 'Z' ){  //换小写
                if(s[i] != 'I')
                    s[i] = s[i] - 'A' + 'a';
            }
            else if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= '0' && s[i] <= '9')
                continue;
            else if(s[i] != ' '){  //s[i]为标点符号时,插入空格分离
                s.insert(i," ");
                i++;
            }
            if(s[i] == '?')
                s[i] = '!';

        }
        //将单词放入字符串数组
        string sx = "";
        for(int i = 0;i < s.size();i++){
            if(s[i] != ' ')
                sx += s[i];
            else if(sx != ""){
                vs.push_back(sx);
                sx = "";
            }
        }
        if(sx != "")      //最后一个单词
            vs.push_back(sx);



        //处理单词
        for(int i = 0;i < vs.size();i++){
            if(vs[i] == "I" || vs[i] == "me")
                vs[i] = "you";
            if( (vs[i] == "can" || vs[i] == "could" ) && i < vs.size()-1 ){
                if(vs[i+1] == "you"){
                    vs[i+1] = vs[i];
                    vs[i] = "I";
                }
            }
        }

        for(int i = 0;i < vs.size();i++){
            cout << vs[i];
            if(i == vs.size() - 1){
                break;

            }
            if(vs[i+1][0] == 'I' || vs[i+1][0] >= '0' && vs[i+1][0] <= '9' || vs[i+1][0] >= 'a' && vs[i+1][0] <= 'z')
                cout << ' ';
        }
        cout << endl;
        vs.clear();


    }

    return 0;
}

题目: N个数求和

这道题当初我就没看到,一直在做那些分高的。

思路:

N个数的求和,化简输出,就是两两进行求和,两个分数的求和就是求解一下最大公约数,化简后再与下一个进行运算。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;

const int maxn = 1e4 + 4;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
ll num1[110],num2[110];

int main(){
    int t;
    char c;
    cin >> t;
    cin >> num1[0] >> c >> num2[0];
    ll N = num1[0],M = num2[0],temp;

    for(int i = 1;i < t;i++){
        cin >> num1[i] >> c >> num2[i];
        ll a = N*num2[i]+M*num1[i],b = num2[i]*M;


        temp = __gcd(a,b);
        a /= temp;
        b /= temp;
        N = a;
        M = b;


    }
    if(N % M==0)
        cout <<  N / M<< endl;
    else if(N < M)
        cout << N << "/" << M << endl;
    else
        cout << N/M << " " << N%M << "/" << M << endl;

    return 0;
}

题目:链表去重

思路:

开一个结构体数组,结构体的序号结点的地址,结构体里面记录数据和下一个结点地址,一个数据标记数组,记录这个结点数据是否之前出现过,开两个数组记录分离后两链表结点的地址, 通过遍历后,再按照题目要求输出即可。

解题代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

struct point{
    int date;
    int next;
}p[101000];
int sign[100100];
int a[101000],b[101000];
int main(){
    int star,n;
    cin >> star >> n;

    for(int i = 0;i < n;i++){
        int x;
        cin >> x;
        cin >> p[x].date >> p[x].next;

    }
    int z = 0,k = 0;
    while(star != -1){
        int nume = abs(p[star].date);

        if( sign[nume] == 0){
            sign[nume] = 1;

            a[z++] = star;
        }
        else
            b[k++] = star;
        star = p[star].next;

    }
    for(int i = 0;i < z;i++){
        if(i == 0)
            printf("%05d %d ",a[i],p[ a[i] ].date);
        else
            printf("%05d\n%05d %d ",a[i],a[i],p[ a[i] ].date);
    }
    printf("-1\n");
    for(int i = 0;i < k;i++){
        if(i == 0)
            printf("%05d %d ",b[i],p[ b[i] ].date);
        else
            printf("%05d\n%05d %d ",b[i],b[i],p[ b[i] ].date);
    }
    if(k)
        printf("-1\n");

}

题目:部落

思路:

整个社区的总人数,可以放进set,set的大小就是总人数,这种集合问题,肯定想通过并查集先处理好集合,处理完集合后,查询两人是否在同一部落的问题也解决了,这个不同部落的个数,我是预先存入了每个小圈子里的第一个人的编号,这样可以通过一个人找到整个小圈子人的父节点,把每个小圈子里父节点放入一个新set中,不同父节点个数即新set的大小就是不同部落个数。

当初写题时,那个一个圈子里只有一个人的情况,我忘记预存它的编号,导致老是有几个点没过,还是太菜了。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 1e6 + 4;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
set<int>s;
set<int>ss;
int setfrist[maxn];
int faset[maxn];
int fa[maxn];
int Find(int x)
{
    if(fa[x] == x)
        return x;
    else
        return fa[x] = Find(fa[x]);
}
void hebing(int a,int b)
{
    int fx = Find(a),fy = Find(b);
    if(fx != fy)
        fa[fx] = fy;
}

int main()
{
    for(int i = 1;i <= maxn;i++){
        fa[i] = i;
    }
    int t,n;
    cin >> t;
    for(int j = 0;j < t;j++){
        cin >> n;
        int a,b;
        if(n == 1){
            cin >> a;
            s.insert(a);
        }
        if(n >= 2){
            cin >> a >> b;
            hebing(a,b);
            s.insert(a);
            s.insert(b);
        }
        setfrist[j] = a;
        for(int i = 3;i <= n;i++){
            int c;
            cin >> c;
            s.insert(c);
            hebing(a,c);
        }
    }

    for(int i = 0;i < t;i++){
        ss.insert( Find( setfrist[i] ) );
    }
    cout << s.size() << " " << ss.size() << endl ;
    int m;
    cin >> m;

    while(m--){
        int x,y;
        cin >> x >> y;
        if(Find(x) == Find(y))
            cout << 'Y' << endl;
        else
            cout << 'N' << endl;
    }


    return 0;
}

 

posted @ 2020-10-18 15:55  emhhbw==  阅读(165)  评论(0)    收藏  举报