Back

2016模拟题

hilaolu

hilaolu

November 4, 2017

[问题描述]
参加 OI 小组的同学很多(实际不超过 200 人)而且素质很高,但社长觉得人多是很麻
烦的事。社长已经没有题目筛选人,只好做一个游戏:每位同学发一张卡片,每张卡片上都
有一个编号(此编号为非负数,且小于 255),每个编号互不相同。社长制定了以下的游戏规
则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号
在这组新数中出现的同学淘汰出局,第二轮,余下的同学再将编号的各位数字进行立方相加
得到一组新数,编号在这组新数中出现的同学再淘汰出局,第三轮,余下的同学再将编号的
各位数字进行 4 次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,„„,
以此类推,经过 n 轮后,仍留下来的同学,将获得加入 OI 社的机会。
[输入文件]
输入文件 happy.in 有两行,第 1 行为 1 个正整数 n(n<8),表示有 n 轮游戏,第二行是
卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
[输出文件]
输出文件 ghillie .out 是 1 行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间
有一个空格。
[输入样例]
1
24 123 2 12 20 14 4 6 36 72
[输出样例]
26122472123

码农题

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int main(){
    int rest,n,tmp,s[200][6],g=0,a[200],p=-1,answ[200];
    cin>>n;
    while(cin>>tmp){
        s[g][0]=tmp;
        s[g][5]=1;
        g++;
    }
    for(int i=0;i<g;i++){
        s[i][1]=0;
        rest=s[i][0];
        while(true){
            p=pow(10,s[i][1]);
            if(rest/p==0)break;
            s[i][s[i][1]+2]=(rest/p)%10;
            s[i][1]++;
        }
    }
    for(int i=2;i<n+2;i++){
        for(int j=0;j<g;j++){
            if(s[j][5]){
                a[j]=0;
                for(int k=0;k<s[j][1];k++)a[j]+=pow(s[j][k+2],i);
            }
        }
        for(int j=0;j<g;j++){
            if(s[j][5]){
                for(int k=0;k<g;k++){
                    if(s[k][5]){
                        if(a[k]==s[j][0]){s[j][5]=0;break;}
                    }
                }
            }
        }
    }
    p=-1;
    for(int i=0;i<g;i++){
        if(s[i][5]){p++;answ[p]=s[i][0];}
    }
    sort(answ,answ+p+1);
    for(int j=0;j<=p;j++)cout<<answ[j]<<" ";
    return 0;
}
Comment has been closed