【上机】模拟赛题(二)

拉到最下面可以看到题解哦!


A.不明飞行物

时间:1s 空间:128MB

题目描述

一颗彗星的后面有一个不明飞行物(UFO),这个UFO 经常到地球上来寻找忠实的追随者,把他们带到宇宙中去。但由于舱内空间有限,它们每—趟只能带一组追随者。尽管如此,外星人仍然想出了一个妙法来决定带谁走:以A代表1,B代表2.......... Z代表26, USACO即21 ×19×1×3×15=17955,倘若此组人的组名所代表的数字与彗星的名字所代表的数字分别除以47,余数相同,则彗星名与组匹配,UFO带此组人飞向宇宙,余数不同则不匹配,故不带。
编程任务:写一程序,打印出彗星名与组名是否相匹配,是打印“GO”,否打印“STAY”;同时打印出两者的余数

输入格式

包含两行,第1行为慧星名,第2行为组名(长度不超过250,只含有大写字母)。

输出格式

输出文件包含两行,第1行为是否匹配的信息,第2行显示两者的余数。

样例数据

【输入1】

COMETHALEBOPP
HEAVENSGATE

【输出1】

GO
r1=r2=17

【输入2】

SHOEMAKERLEVY
USACO

【输出2】

STAY
r1=21 r2=1

B.素数排序

时间:1s 空间:128MB

题目描述

给你N个数,请根据对其中的素数进行排序,要求该素数上各位数字的和最小的排在前面,如果和相同,则位数个数少的排在前面,如果位数也相同,则数值小的排在前面。(素数是2,3,5,7....)

输入格式

输入包含多组测试数据,每组数组第一行是一个正数N(N < 1000),接着第二行是N个正数,每个正数以空格相隔,每个数小于100000。

输出格式

对于每组输入,输出按要求排序的素数,要求每个数之间用空格分隔,如果输入的数据没有素数,则输出no primes。

样例数据

【输入】

14
4 2 4 5 3 11 17 66 13 21 5 101 31 2
3
4 4 4

【输出】

2 2 11 101 3 13 31 5 5 17
no primes

C.菲菲玩序列

题目描述

菲菲手上有一个长度为n的整数序列a1, a2,…,an,但是她不太喜欢这个序列,因此她想通过一些操作将序列a变成自己想要的序列b。初始时序列b是空的,接下来菲菲将依次进行n次操作,其中第i次操作分为以下两步:
1、将ai加到序列b的尾部;
2、翻转序列b(即b1,b2,…,bi变成bi,bi-1,…,b1 )。
菲菲想知道n次操作之后序列b会是什么样的,你能帮助她吗?

输入格式

第一行包含一个正整数n;
第二行包含n个正整数,第i个正整数表示ai。

输出格式

共一行,包含n个数,表示n次操作后的序列b。

样例数据

【输入】

4
1 2 3 4

【输出】

4 2 1 3

样例解释

每次操作后序列b如下:
●1
●2,1
●3,1,2
●4,2,1,3

数据规模与约定

对于20%的数据,n≤100
对于50%的数据,n≤1000
对于100%的数据,1≤n≤2×10^50≤a_i≤10^9


D.盒子

时间:1s 空间:128MB

题目描述

菲菲在玩堆盒子的游戏,每个盒子有个强度,代表它上方最多能堆多少个盒子。由于盒子都是一样大的,所以不能在一个盒上并列放超过一个盒子。现在菲菲有n个盒子,第i个盒子的强度为xi。菲菲想知道,如果她要把这些盒子全部堆起来,至少要堆多少堆。

输入格式

共2行。
第一行一个整数n,代表菲菲有的盒子个数。
第二行读入n个整数,第i个整数x_i表示第i个盒子的强度。
输出格式
共一行,一个整数表示菲菲至少要堆多少堆。

样例数据
【输入】

5
0 2 1 1 2

【输出】

2

数据规模与约定

对于20%的数据,n≤10;
对于50%的数据,n≤1000;
对于100%的数据,n≤5 \times 10^5x_i≤10^9


建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!
建议先自己做再看题解哦!


A.不明飞行物

【代码】

#include<bits/stdc++.h>
using namespace std;
int N=1e3+5,BIG=(1<<31)-1,SMALL=-(1<<31);

int r(string a)
{
    int l=a.size(),sum=1;
    for(int i=0; i<l; i++)
        sum=(sum*(int(a[i])-'A'+1))%47;//随时随地取余
    return sum;
}
int main()
{
    string a,b;
    cin>>a>>b;
    int c,d;
    c=r(a),d=r(b);//计算两个数
    if(c==d)
        printf("GO\nr1=r2=%d",c);
    else
        printf("STAY\nr1=%d r2=%d",c,d);
    return 0;
}

B.素数排序

【分析】

【代码】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5,BIG=(1<<31)-1,SMALL=-(1<<31);
bool p[N+5];
int a[1005],weihe[1005],weishu[1005],bianhao[1005];

void prime(int maxn)
{
    //1为不是,0为是
    p[1]=1,p[0]=1;
    for(int i=2; i<=maxn; i++)
        if(!p[i])
            for(int j=i+i; j<=maxn; j+=i)
                p[j]=1;
}
bool cmp(int a1,int a2)
{
    if(weihe[a1]!=weihe[a2])return weihe[a1]<weihe[a2];
    if(weishu[a1]!=weishu[a2])return weishu[a1]<weishu[a2];
    return a[a1]<a[a2];
}
int main()
{
    prime(N);
    int b,c,d,e,f;
    while(cin>>b)//判断文件是否结束
    {
        d=0;
        for(int i=1; i<=b; i++)
        {
            cin>>c;
            if(!p[c])
            {
                d++;
                a[d]=c,weihe[d]=0,weishu[d]=0,bianhao[d]=d,e=c;
                while(e!=0)
                {
                    weihe[d]+=e%10;
                    e/=10;
                    weishu[d]++;
                }//位数和数位和一起求
            }
        }
        if(d==0)//判断是否空数组
        {
            cout<<"no primes\n";
            continue;
        }
        sort(bianhao+1,bianhao+1+d,cmp);//排序
        for(int i=1; i<=d; i++)
            cout<<a[bianhao[i]]<<' ';//挨个输出
        cout<<endl;//别忘了换行
    }
    return 0;
}

C.菲菲玩序列

【分析】

按部就班操作。。。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,BIG=(1<<31)-1,SMALL=-(1<<31);
int a[N],b[N];

int main()
{
    int c,d,e,f,g,h;
    cin>>c;
    for(int i=1; i<=c; i++)
    {
        b[i]=i;
        for(int m1=1,m2=i; m1<m2; m1++,m2--)//反转序号
            d=b[m1],b[m1]=b[m2],b[m2]=d;
    }
    for(int i=1; i<=c; i++)
        cin>>a[i];
    for(int i=1; i<=c; i++)
        cout<<a[b[i]]<<' ';
    return 0;
}

D.盒子

【分析】

优先队列自动排列。。。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,BIG=(1<<31)-1,SMALL=-(1<<31);
int a[N],b,tot;
priority_queue < int , vector < int > , greater < int > > box;
//优先队列这种东西防止出错的方法是加空格

int main()
{
    cin>>b;
    for (int i=1;i<=b;i++)
        cin>>a[i];
    sort(a+1,a+1+b);
    box.push(1);//为第一个盒子新建一叠盒子
    tot++;
    for (int i=2;i<=b;i++)
    {
        int p=box.top();//取顶端元素,即堆得最低的盒子
        if (p<=a[i])//如果a[i]大于p,说明第i个盒子可以被压在这一叠盒子之下
        {
            box.pop();
            box.push(p+1);//修改这一堆盒子的高度
        }
        else tot++,box.push(1);//说明第i个盒子不能放在任何一叠盒子上面,所以要新建一叠盒子
    }
    cout<<tot<<endl;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容