ACM 实验室2020.10.17天梯赛练习*3

7-1 判断素数 (10分)

对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No

(原来1不是质数来着QWQ)

#include <bits/stdc++.h>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int main()
{
    long long k,a,i;
    cin>>k;
    while(k--)
    {
        cin>>a;
        if(a==2)
        {
            cout<<"Yes"<<endl;
        }else if(a==1){
           cout<<"No"<<endl; 
        }
        else
        {
            int flag=0;
            for(i=2; i*i<=a+1; i++)
            {
                if(a%i==0)
                {
                    cout<<"No"<<endl;
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                cout<<"Yes"<<endl;
            }
        }

    }
    return 0;
}

7-2 寻找250 (10分)

在一行中输出第一次出现的“250”是对方扔过来的第几个数字

#include <bits/stdc++.h>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int main()
{
    int i=0,a;
    while(cin>>a){
            i++;
        if(a==250){
            cout<<i<<endl;
        break;
        }
    }
    return 0;
}

7-3 幸运彩票 (15分)

6位数,如果前三位之和等于后三位,这个数就是幸运的

#include <bits/stdc++.h>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int main()
{
    int k;
    cin>>k;
    while(k--){
        string s;
        cin>>s;
        if(s[0]+s[1]+s[2]==s[3]+s[4]+s[5]){
            cout<<"You are lucky!"<<endl;
        }else{
        cout<<"Wish you good luck."<<endl;
        }
    }
    return 0;
}

7-4 出生年 (15分)

输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

写一个函数判断这个四位数有几位相同,从给定年份循环+1判断,最早满足条件的年份

#include <bits/stdc++.h>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int same(int n)
{
    int a[4];
    a[0]=n%10;
    n=n/10;
    a[1]=n%10;
    n=n/10;
    a[2]=n%10;
    n=n/10;
    a[3]=n%10;
    sort(a,a+4);
    int flag=1;
    for(int i=1; i<4; i++)
    {
        if(a[i]!=a[i-1]){
            flag++;

        }
    }
    return flag;
}
int main()
{

    int y,n,x,i;
    cin>>y>>n;
    x=y;
    i=0;
    while(same(x)!=n){
        x++;
        i++;
    }
    printf("%d %04d",i,x);
    return 0;
}

7-5 敲笨钟 (20分)

对每一行诗句,判断其是否压“ong”韵。即判断‘,’‘。’前的是不是ong。

如果是压此韵的,将最后三个拼音改成 “敲笨钟”,即替换倒数第三个空格后的内容

否则输出 Skipped,即跳过此句。

#include <bits/stdc++.h>
#include<algorithm>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int main()
{

    int k,i;
    cin>>k;
    getchar();
    while(k--)
    {

        string s;
        getline(cin,s);

        //cout<<s<<endl;
        int flag=0;
        for(i=0; i<s.length(); i++)
        {
            if(s[i]==',')
            {
                if(s[i-1]=='g'&&s[i-2]=='n'&&s[i-3]=='o')
                {
                    flag++;
                }
            }
            if(s[i]=='.')
            {
                if(s[i-1]=='g'&&s[i-2]=='n'&&s[i-3]=='o')
                {
                    flag++;
                }
            }
        }
        if(flag!=2)
        {
            cout<<"Skipped"<<endl;
        }
        else
        {
            int flag=0;
            for(i=s.length()-1;i>=0;i--){
                if(s[i]==' '){
                    flag++;
                }
                s[i]='\0';
                if(flag==3){
                    //cout<<" qiao ben zhong."<<endl;
                    break;
                }
            }
            for(i=0;i<s.length();i++){
                if(s[i]!='\0')
                cout<<s[i];
            }
            cout<<" qiao ben zhong."<<endl;

        }
    }
    return 0;
}

7-6 日期格式化 (5分)

在一行中按照“mm-dd-yyyy”的格式给出月、日、年,按“yyyy-mm-dd”的格式输出

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,c;
    scanf("%d-%d-%d",&a,&b,&c);
    printf("%d-%02d-%02d\n",c,a,b);
    return 0;
}

7-7 A-B (20分)

从字符串A中把字符串B所包含的字符全删掉,输出删除之后的结果

#include <bits/stdc++.h>
#include<algorithm>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int main()
{

    string a,b;
    int i,j;
    getline(cin,a);
    getline(cin,b);
    for(i=0;i<b.length();i++){
        for(j=0;j<a.length();j++){
            if(a[j]==b[i]){
                a[j]='\0';
            }
        }
    }
    for(i=0;i<a.length();i++){
        if(a[i]!='\0')
            cout<<a[i];
    }
    cout<<endl;
    return 0;
}

7-8 计算指数 (5分)

计算2^n

#include <bits/stdc++.h>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
int main()
{
    int n,sum,i;
    cin>>n;
    cout<<2<<"^"<<n<<" = "<<pow(2,n)<<endl;
    return 0;
}

7-10 抢红包 (25分)

n个人轮流发红包,其他人抢,按照收入金额从高到低的递减顺序输出每个人的编号和收入金额。每个人的信息占一行,两数字间有1个空格。如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。

#include <bits/stdc++.h>
#include<algorithm>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;
struct people{
int no=0;
int money=0;
int num=0;
}a[10010],temp;
bool cmp(people s,people b){
    if(s.money>b.money){
        return 1;
    }else if(s.money==b.money &&s.num>b.num){
    return 1;
    }else if(s.money==b.money &&s.num==b.num &&s.no<b.no){
    return 1;
    }
    return 0;
}
int main()
{
    int n,i,j,k;
    cin>>n;
    for(i=0;i<n;i++){
        a[i+1].no=i+1;
    }
    for(i=1;i<=n;i++){
        cin>>k;
        int no,money;
        for(j=0;j<k;j++){
            cin>>no>>money;
            a[no].money+=money;
            a[no].num++;
            a[i].money-=money;
        }
    }
    sort(a+1,a+n+1,cmp);
    for(i=1;i<=n;i++){
        printf("%d %.2f\n",a[i].no,a[i].money/100.0);
        //cout<<a[i].no<<" "<<a[i].money/100.0<<endl;
    }
    return 0;
}
7-11 互评成绩 (25分)

学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,按非递减顺序输出最后得分最高的M个成绩

#include <bits/stdc++.h>
#include<algorithm>
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define ll long long
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define eps 1e-6
using namespace std;

int main()
{
    int n,k,m,i,j;
    double sum,a[10010],b[15],m1,m2,m3;
    cin>>n>>k>>m;
    for(i=0;i<n;i++){
        sum=0;
        for(j=0;j<k;j++){
            scanf("%lf",&b[j]);
            //cin>>b[j];
            sum+=b[j];
        }
        sort(b,b+k);
        sum-=b[0]+b[k-1];
        a[i]=sum/(k-2);
        //cout<<a[i]<<endl;
    }
    sort(a,a+n);

    for(i=n-m;i<n;i++){
        if(i!=n-1){
            printf("%.3f ",a[i]);
        }else{
        printf("%.3f",a[i]);
        }
    }
    printf("\n");
    return 0;
}

7-9 小字辈 (25分)

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。

输入在第一行给出家族人口总数 N,家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。

首先输出最小的辈分。然后在第二行按递增顺序输出辈分最小的成员的编号。

 

 参考大佬代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v[100005],ans;
vector<int>::iterator it;
int maxd;
void dfs(int n,int deep)
{
    int i;
    for (i=0;i<v[n].size();i++)
        dfs(v[n][i],deep+1);
    if (deep>maxd)
    {
        maxd=deep;
        ans.clear();
        ans.push_back(n);
    }
    else if (maxd==deep)
        ans.push_back(n);
}
int main()
{
    int n,i,t,pos;
    cin>>n;
    for (i=1;i<=n;i++)
    {
        cin>>t;
        if (t==-1)
        {
            pos=i;
            continue;
        }
        v[t].push_back(i);
    }
    dfs(pos,1);
    sort(ans.begin(),ans.end());
    cout<<maxd<<endl;
    cout<<*ans.begin();
    for (it=ans.begin()+1;it!=ans.end();it++)
        cout<<' '<<*it;
    cout<<endl;
    return 0;
}

 

 

 

 

 

posted @ 2020-10-25 21:41  一只幽灵飘过  阅读(115)  评论(0编辑  收藏  举报