蓝杯四十七

算法训练 筛选号码 

时间限制:1.0s  内存限制:512.0MB

提交此题   

问题描述

  有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。

  问最后留下的是原来第几号的那位。

  举个例子,8个人围成一圈:

  1 2 3 4 5 6 7 8

  第1次报数之后,3退出,剩下:

  1 2 4 5 6 7 8 (现在从4开始报数)

  第2次报数之后,6退出,剩下:

  1 2 4 5 7 8 (现在从7开始报数)

  第3次报数之后,1退出,剩下:

2 4 5 7 8 (现在从2开始报数)

  第4次报数之后,5退出,剩下:

  2 4 7 8 (现在从7开始报数)

  第5次报数之后,2退出,剩下:

  4 7 8 (现在从4开始报数)

  第6次报数之后,8退出,剩下:

  4 7 (现在从4开始报数)

  最后一次报数之后,4退出,剩下:

  7.

  所以,最后留下来的人编号是7。

输入格式

  一个正整数n,(1

输出格式

  一个正整数,最后留下来的那个人的编号。

样例输入

8

样例输出

7

数据规模和约定

  对于100%的数据,1

#include  

#define MAXN 10000 

 

int main() 

     

    int a[MAXN]; 

     

    int i, j, n, t, c; 

     

    scanf("%d", &n); 

     

    for(i = 1; i <= n; i ++){ 

        a[i] = i; 

    } 

     

    c = t = n; 

    j = 0; 

    while(t > 1){ 

        c = 0; 

  for(i = 1; i <= t; i ++){ 

            if(++j % 3){ 

                a[++c] = a[i]; 

            } 

        } 

        t = c; 

    } 

     

    printf("%d", a[1]); 

     

    return 0; 

思路分析:

①定义变量:正整数,编号,报数(一维数组) ,循环次数;

②输入正整数;

③for语句循环输入顺序排号;

④进行判断筛选号码;

⑤输出最后留下的是原来第几号的那位。





算法提高 分数统计 

时间限制:1.0s  内存限制:512.0MB

提交此题   

问题描述

  2016.4.5已更新此题,此前的程序需要重新提交。

问题描述

  给定一个百分制成绩T,将其划分为如下五个等级之一:

  90~100为A,80~89为B,70~79为C,60~69为D,0~59为E

  现在给定一个文件inp,文件中包含若干百分制成绩(成绩个数不超过100),请你统计五个等级段的人数,并找出人数最多的那个等级段,按照从大到小的顺序输出该段中所有人成绩(保证人数最多的等级只有一个)。要求输出到指定文件oup中。

输入格式

  若干0~100的正整数,用空格隔开

输出格式

  第一行为5个正整数,分别表示A,B,C,D,E五个等级段的人数

  第二行一个正整数,表示人数最多的等级段中人数

  接下来一行若干个用空格隔开的正整数,表示人数最多的那个等级中所有人的分数,按从大到小的顺序输出。

样例输入

100 80 85 77 55 61 82 90 71 60

样例输出

2 3 2 2 1

3

85 82 80

#include  

#include  

int num[1005]; 

using namespace std; 

int main() 

    int n,i = 0,sum; 

    int temp[5][1005],dp[5] = {90,80,70,60,0}; 

    memset(temp,0,sizeof(temp)); 

    cin>>sum; 

    for(;i < sum;i++) 

    { 

        cin>>num[i]; 

        for(int j = 0;j < 5;j++) 

        { 

if(num[i] >= dp[j]) 

            { 

                temp[j][++temp[j][0]] = num[i]; 

                break; 

            } 

        } 

    } 

    int maxn = 0,maxl = 0; 

    for(int t = 0;t < 5;t++) 

    { 

        cout<

        if(maxn < temp[t][0]) 

        { 

            maxn = temp[t][0]; 

            maxl = t; 

        } 

    } 

cout<

    sort(temp[maxl]+1,temp[maxl]+temp[maxl][0]+1); 

    for(int t = temp[maxl][0];t >= 1;t--) 

        cout<

    return 0; 

思路分析:

① 定义变量:五个等级段的人数,人数最多的等级段中人数,人数最多的那个等级中所有人的分数,(一维数组);

②输入5个等级段的人数;

③找出人数最多的那个等级段;

④从大到小的顺序,输出该段中所有人成绩(保证人数最多的等级只有一个)。

你可能感兴趣的:(蓝杯四十七)