2020.10.17天梯赛练习

题目:判断素数

思路:

数据较小,直接暴力就可,做的时候没有注意特判1的情况。

解题代码:

#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 = 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++)

int main(){

    int n;
    cin >> n;
    for(int i = 0;i < n;i++){
        int m;
        cin >> m;
        if(m == 1){
            cout << "N0" << endl;
            continue;
        }

        int sign = 1;
        for(int i = 2;i <= sqrt(m);i++){
            if(m % i == 0){
                sign = 0;
                break;
            }
        }
        if(sign)
            cout << "Yes" << endl;
        else
            cout << "N0" << endl;
    }




    return 0;
}

题目:出生年

思路:

这题当时做的时候,想着通过什么方法直接找出来,结果发现只需要枚举年份就可以了,枚举年份找到符合要求的即可。

解题代码:

#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 = 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++)
int x[10];
int main(){

    int year ,num;
    cin >> year >> num;
    for(int i = year;i < 3500;i++){
        ll sum = 0;
        memset(x,0,sizeof(x));
        x[i%10] = 1;
        x[i/10 % 10] = 1;
        x[i/100 % 10] = 1;
        x[i/1000] = 1;
        for(int j = 0;j < 10;j++)
            sum += x[j];
        if(sum == num){
            printf("%d %04d\n",i-year,i);
            break;
        }

    }


    return 0;
}

题目:敲笨钟

思路:

做这道题时,我的思路就错了,我当时找的是ong子串位置,但这要如果其他位置出现ong,我就会错,这题其实是找逗号与句号,通过定位往前找ong,然后控制一下输出即可。

解题代码:

#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 = 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++)
int main(){
    int t;
    string ss[150];
    cin>>t;
    while(t--){
        int sign1 = 0,sign2 = 0;
        int i = 0;
        while(cin >> ss[i]){
            if(ss[i][ss[i].length()-1] == ','){
                if(ss[i][ss[i].length()-4] == 'o' && ss[i][ss[i].length()-3] == 'n' && ss[i][ss[i].length()-2] == 'g'){
                    sign1 = 1;
                }
            }
            if(ss[i][ss[i].length()-1] == '.'){
                if(ss[i][ss[i].length()-4] == 'o' && ss[i][ss[i].length()-3] == 'n' && ss[i][ss[i].length()-2] == 'g'){
                    sign2 = 1;
                }
                break;
            }
            i++;
        }
        if(sign1 && sign2){
            for(int w = 0;w < i-2;w++){
                cout<< ss[w] << " ";
            }
            cout << "qiao ben zhong." << endl;
        }
        else{
            cout << "Skipped" << endl;
        }

    }
    return 0;
}

题目:小字辈

思路:

用一个数组来记录辈分关系( v[x] 指的就是x的子辈集合),一个数组用来不断更新最小辈分成员(endn), 从最长辈往下进行dfs,最后便可更新出一个最小辈分数组,再按照要求输出。

解题代码:

#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 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<int> v[500000];
vector<int> endn;
int maxn;

void dfs(int n,int deep){
    for(int i = 0;i < v[n].size();i++){
        dfs(v[n][i],deep+1);    //对下一辈的进行搜索判断有无子代
    }
    if(deep > maxn){         //如果有更小的子代,数组清空
        maxn = deep;
        endn.clear();
        endn.push_back(n);
    }
    else if(maxn == deep){      //辈分相同且最小,存进数组
        endn.push_back(n);
    }
}
int main(){

    int n,fa;
    cin >> n;
    for(int i = 1;i <= n;i++){
        int x;
        cin >> x;
        if(x == -1){
            fa=i;
            continue;
        }
        v[x].push_back(i);//把 x 的儿子放入
    }
    dfs(fa,1);
    sort(endn.begin(),endn.end());

    cout << maxn << endl;

    for(auto it = endn.begin();it != endn.end();it++){
        if(it == endn.begin())
            cout << *it;
        else
            cout << " " << *it;
    }
    cout << endl;
}

 

posted @ 2020-10-25 17:03  emhhbw==  阅读(90)  评论(0)    收藏  举报