ZUST- 程序设计算法竞赛基础【2】

1001.sort

题目:
Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3
3 -35 92 213 -644
Sample Output
213 92 3
题目网址

解题思路:哈希算法查找----将一组数据放入数组中并标记,在按大小顺序找出。

代码:

#include<stdio.h>
int a[1000000];//初始化数组,使其值都为0;
int main()
{
    int i,n,m,x;
    while(scanf("%d%d",&n,&m)!=EOF)
	{
        for(i=0;i<n;i++)
		{
            scanf("%d",&x);
            a[x+500000]=1;//标记
        }
         for(i=500000;i>=-500000;i--)
		{
            if(a[i+500000]==1)//直接设i,从大到小查找
			{
                printf("%d",i);
                m--;//输出m个数
                if(m!=0) printf(" ");
                else
				{
                    printf("\n");
                    break;
                }
            }
        } 
    }
    return 0;
}

1002.EXCEL排序

题目:
Problem Description
Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。
Input
测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有 N
行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
Sample Input
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
0 0
Sample Output
Case 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Case 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Case 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
题目网址

解题思路:利用C++sort排序,先将id排序,再根据条件排序更加便捷。

sort排序模板:

struct node
{
	int a;
	double b;
}arr[100];
//先按a值升序排列,如果a值相同,再按b值降序排列 
bool cmp(node x,node y)
{
	if(x.a!=y.a)
	{
		return x.a<x.b;
	}
	else
	{
		return x.b>y.b;
	}
}

sort(arr,arr+100,cmp); 

题目代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

#define MAX 100001
struct Student
{
    char id[7];
    char name[9];
    int score;
};Student student[MAX];

bool compare1(Student x,Student y)
{
    return strcmp(x.id,y.id)<0;
}
bool compare2(Student x,Student y)
{
    return strcmp(x.name,y.name)<0;
}
bool compare3(Student x,Student y)
{
    return x.score<y.score;
}
int main()
{
    int N,C,i;
    int cnt=1;
    while(scanf("%d%d",&N,&C)!=EOF)
    {
        if(N==0&&C==0) break;
        for(i=0;i<N;i++)
        {
            scanf("%s %s %d",student[i].id,student[i].name,&student[i].score);
        }
        sort(student,student+N,compare1);//现将学号排序,再按条件排序
        switch(C)
        {
            case 1:break;
            case 2:stable_sort(student,student+N,compare2);break;//stable保证相同的元素保持原来次序
            case 3:stable_sort(student,student+N,compare3);break; 
        }
        printf("Case %d:\n",cnt++);
        for(i=0;i<N;i++)
        {
            printf("%s %s %d\n",student[i].id,student[i].name,student[i].score);
        }
    }
    return 0;
}

1003.Design T-Shirt

题目:
Problem Description
Soon after he decided to design a T-shirt for our Algorithm Board on Free-City BBS, XKA found that he was trapped by all kinds of suggestions from everyone on the board. It is indeed a mission-impossible to have everybody perfectly satisfied. So he took a poll to collect people’s opinions. Here are what he obtained: N people voted for M design elements (such as the ACM-ICPC logo, big names in computer science, well-known graphs, etc.). Everyone assigned each element a number of satisfaction. However, XKA can only put K (<=M) elements into his design. He needs you to pick for him the K elements such that the total number of satisfaction is maximized.
Input
The input consists of multiple test cases. For each case, the first line contains three positive integers N, M and K where N is the number of people, M is the number of design elements, and K is the number of elements XKA will put

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值