NOIP201101&&05

时间:2024-05-31 00:06:21
NOIP200701奖学金
难度级别:A;            运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述
   某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。
   先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,
   如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。  
   任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。
   注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。
   例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7279

5279

这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。

这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,

但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

5279

7279

则按输出错误处理,不能得分。

输入
包含n+1行:  第1行为一个正整数n,表示该校参加评选的学生人数。 
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间z第1行的3个数 字依次表示学号为j-1的学生的语文、数学、英语的成绩。
每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。 
所给的数据都是正确的,不必检验。 
输出
共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。 
输入示例
【输入样例1】 
6      
90 67 80  
87 66 91    
78 89 91     
88 99 77     
67 89 64       
78 89 98       
【输入样例2】
8     
80 89 89     
88 98 78    
90 67 80    
87 66 91     
78 89 91     
88 99 77     
67 89 64     
78 89 98  
输出示例

【输出样例1】 
6 265
4 264
3 258
2 244
1 237
【输入样例1】 
8 265
2 264
6 264
1 258
5 258

其他说明
【限制】50%的数据满足:各学生的总成绩各不相同 100%的数据满足: 6<=n<=300 

呵呵,典型暴力,我又一次呵呵的笑了,又用暴力A过了。。

#include<iostream>
using namespace std;
struct data
{
    int x,y,z,sum,id;
};
int read()
{
    ,f=;char ch=getchar();
    ')
    {
        ;
        ch=getchar();
    }
    ')
    {
        x=x*+ch-';
        ch=getchar();
    }
    return x*f;
}
;
data a[maxn];
int main()
{
    int n=read();
    ;i<n;i++)
    {
        a[i].y=read();
        a[i].x=read();
        a[i].z=read();
        a[i].sum=a[i].x+a[i].y+a[i].z;
        a[i].id=i+;
    }
    ;i<n;i++)
    {
        ;j<n;j++)
        {
            if(a[i].sum<a[j].sum)
            {
                swap(a[i].id,a[j].id);
                swap(a[i].sum,a[j].sum);
                swap(a[i].x,a[j].x);
                swap(a[i].y,a[j].y);
                swap(a[i].z,a[j].z);
            }
            else if((a[i].sum==a[j].sum) && (a[i].y<a[j].y))
            {
                swap(a[i].id,a[j].id);
                swap(a[i].sum,a[j].sum);
                swap(a[i].x,a[j].x);
                swap(a[i].y,a[j].y);
                swap(a[i].z,a[j].z);
            }
            else if((a[i].sum==a[j].sum) && (a[i].y==a[j].y) && (a[i].id>a[j].id))
            {
                swap(a[i].id,a[j].id);
                swap(a[i].sum,a[j].sum);
                swap(a[i].x,a[j].x);
                swap(a[i].y,a[j].y);
                swap(a[i].z,a[j].z);
            }
        }
    }
    ;i<;i++)cout<<a[i].id<<" "<<a[i].sum<<endl;
    ;
}

NOIP200705统计数字

难度级别:A;            运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述
  某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入
包含n+1行; 第一行是整数n,表示自然数的个数; 第2~n+1每行一个自然数。
输出
包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入示例
8 2 4 2 4 5 100 2 100
输出示例
2 3 4 2 5 1 100 2
其他说明
【限制】40%的数据满足:1<=n<=1000;80%的数据满足:1<=n<=50000;100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*10^9)

呵呵,还是暴力,我又笑了。。。又用暴力A过了。。。

#include<iostream>
using namespace std;
int read()
{
    ,f=;char ch=getchar();
    ')
    {
        ;
        ch=getchar();
    }
    ')
    {
        x=x*+ch-';
        ch=getchar();
    }
    return x*f;
}int main()
{
    int n=read();
    int a[n];
    ;i<n;i++)a[i]=read();
    sort(a,a+n);
    ;
    ;i<n;i++)
    {
        ])
        {
            printf(],temp);
            temp=;
        }
        ])temp++;
    }
    printf(],temp);
    ;
}

暴力无敌。。。。

相关文章