列表

详情


NC54253. 能不能让我捧个杯啊

描述

在刚刚结束的第44届ACM−ICPC国际大学生程序设计竞赛亚洲区域赛(银川站)中,我校成功获得了铜牌,这也是校史首次在该赛事中获奖。



然而,比赛结束后,队内的两位主力选手 lzh、zcy却不太开心,因为我校排在122名,位居铜牌区首位,只差一名就可以拿到银牌。

ACM−ICPC区域赛金银铜奖的规则大致如下:
金银铜奖分别为有效参赛队总数的10%、20%、30%,即排名前10%为金奖,11%-30%为银奖,31%-60%铜奖。有些巨佬参赛队会打星参赛,即参与排名,但颁奖时不计入在内。
现在给出有效参赛队总数和打星队伍的排名,请你计算一下金银铜奖实际依次对应的名次

输入描述

第一行两个整数,用空格隔开,表示有效参赛队总数 N 和打星队伍的数量 K 
第二行有 K 个整数,用空格隔开,依次表示 K 支打星队伍的排名(注意:这 K 支队伍排名无序)

 ,为方便计算,保证 N 是 10 的整数倍

输出描述

输出由三行构成,每行两个整数,中间由空格隔开
三行依次对应金奖、银奖、铜奖。每行的两个整数依次代表第一个获得金/银/铜奖的队伍排名,和最后一个获得金/银/铜奖的队伍排名

示例1

输入:

400 1
88

输出:

1 40
41 121
122 241

说明:

样例表示有400支有效参赛队,可算出应有40个金奖、80个银奖、120个铜奖。1支打星队,排名为第88名
则排名1-40名为金奖
排名41-120的队伍中有一支打星队,所以银奖跳过该打星队顺延一名,排名41-121的队伍获得银奖
铜奖依次顺延,排名122-241的队伍获得铜奖

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 49ms, 内存消耗: 12112K, 提交时间: 2020-02-16 16:05:09

import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int K = sc.nextInt();
		int [] a = new int [K];
		for (int i = 0; i < K; i++){
			a[i] = sc.nextInt();
		}
		Arrays.sort(a);
		int [] m = new int [N+K];
		for (int i = 0; i < K; i++){
			m[(a[i])-1] = a[i];
		}
		int yi = (int) (N * 0.1);
		int er = (int) (N * 0.3);
		int san = (int) (N * 0.6);
		int A = 0;
		int B = 0;
		int C = 0;
		int D = 0;
		int E = 0;
		int F = 0;
		int q = 0;
		for (int i = 0; i < N + K; i++){
			if (m[i] == 0){
				q++;
				if(q == 1){
					A = i + 1;
				}
				if(q == yi){
					B = i + 1;
					C = i + 2;
				}
				
				if(q == er){
					D = i + 1;
					E = i + 2;
				}
				if(q == san){
					F = i + 1;
				}
			}
		}
		System.out.println(A + " " + B);
		System.out.println(C + " " + D);
		System.out.println(E + " " + F);
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 388K, 提交时间: 2019-11-11 18:05:33

#include<iostream>
#include<vector>
bool a[501];
int b[501];
using namespace std;
int main()
{
    int N,K,x,t=0;
    cin>>N>>K;
    
    for(int i=1;i<=K;i++)
    {
      cin>> x;
        a[x]=true;
    }
    for(int i=1;i<=N;i++)
    {
        if(a[i]==false)
            b[++t]=i;
        
    }
    printf("%d %d\n%d %d\n%d %d",b[1],b[N/10],b[N/10+1],b[3*N/10],b[3*N/10+1],b[6*N/10]);
        return 0;
}

C++14(g++5.4) 解法, 执行用时: 2ms, 内存消耗: 368K, 提交时间: 2019-10-29 15:13:02

# include<stdio.h>

int m[705];
bool vis[705];
int main()
{	
	int n, k, x, i, j = 0;
	scanf("%d %d",&n, &k);
	for(i=1;i<=k;i++){
		scanf("%d",&x);
		vis[x] = true;
	}
	
	for(i=1;i<=n+k;i++){
		if(!vis[i]){
			m[++j] = i;
		}
	}
	n /= 10; 
	printf("%d %d\n%d %d\n%d %d\n",m[1],m[n],m[n+1],m[3*n],m[3*n+1],m[6*n]);
	
	return 0;
}

上一题