SWJTU第十六届 ACM“新秀杯”决赛题解

SWJTU第十六届 ACM“新秀杯”决赛-部分题目题解

C:人口普查

描述

2020年12月13日,人口普查员jyz前往太空普查行星K-452b上的人口。1小时后,jyz完成了他的人口普查任务。

经统计,行星K-452b上有n个人,每个人都有自己的出生年份和死亡年份。求哪一年该星球上的人口数量最多,最多时有多少人。

输入

第一行1个整数 n ( 1 <= n <= 10^5)

接下来n行,每行2个数b、d(1 <= b < d <= 10^9 ),分别表示这个人的出生日期和死亡日期。

输出

一行,2个整数,用空格隔开,分别为人口数量最多的年份y和第y年上的人口数量k。

当存在多个y符合题意时,输出最小的y和对应的k。

输入样例 1

4
4 6
3 4
4 5
8 10

输出样例 1

4 2

提示

每个人活了d-b年。在第4年,第二个人刚去世,不算进总人口。第1、3两个人活着。

思路
首先对出生年份和死亡年份排序,遍历出生年份。当前出生年份小于死亡年份时人口数量+1,并同时判断当前的人口数是否为最大人口数;大于死亡年份时人口数量-1。
代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int b[100000+10],d[100000+10];

int main(){
    int n,k=1,max_people=1;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&b[i],&d[i]);

    }
    int date=b[0];
    sort(b,b+n);
    sort(d,d+n);
    int i=1,j=0;
    while(i<n&&j<n){
        if(b[i]<d[j]){
            k++;
            if(k>max_people){
                max_people=k;
                date=b[i];
            }
            i++;
        }
        else {
            k--;
            j++;
        }
    }
    printf("%d %d",date,max_people);
    return 0;
}

D:胖生快餐店

描述

胖生来没事决定开一家名为汉包王的快餐店,该餐厅提供n种食物,编号从1到n。
第i种食物的利润是a_i。(注意:利润可能是负的,因为它使用了昂贵的原料) 第一天,胖生为第i种食物准备了b_i个盘子。

汉包王快餐店的独特之处在于订购食物的过程。 胖生本人将为每个访客选择食物给该访客。并且在选择食物的时候,胖生会遵循以下规则:

1、每个访客应至少获得一道菜。

2、每一位游客得到的食物必须是从第一种食物开始,连续地获得。对于每种食物每个顾客都只会得到一盘。
例如,游客可能会得到第一类食物1盘,第二种食物1盘,第三种食物1盘。再比如游客不能只得到第一类食物和第三类食物。

胖生想知道汉包王快餐店最多可容纳多少访客? 而且他想知道当为最大访问数时可以赚取的最大利润。

输入

第一行一个整数T(1<=T<=10)表示一共有多少组测试

每个测试:

第一行一个整数n(1<=n<=10^5)表示食物的种类

第二行包含n个用空格分隔开的数字ai(-10^9 <= a_i <=10^9表示一盘第i种食物能获得的利润

第三行包含n个用空格分隔开的数字bi(1<=b_i<=10^5)表示第i种食物有多少盘。

输出

对于每组测试,输出一行为“Case #x: y z”,其中x表示是第几个测试,y表示最大容纳的顾客数量,z表示最大的利润。

输入样例 1

2
3
2 -1 3
3 2 1
4
3 -2 3 -1
4 2 1 2

输出样例 1

Case #1: 3 8
Case #2: 4 13

提示

你的int存不下哦

思路:b_1为最大顾客数量,之后的顾客数量递减。若利润为负数则推到下一盘菜算共同的最大利润。变量类型使用long long。
代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

long long a[100000+10],b[100000+10];

int main(){
    long long t,n,x=1,y;
    long long z;
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
        }
        for(int i=0;i<n;i++){
            scanf("%lld",&b[i]);
            if(i>0)b[i]=min(b[i-1],b[i]);
        }
        y=b[0];
        z=a[0]*b[0];
        for(int i=1;i<n;i++){
            if(a[i]>=0){
                z=z+a[i]*min(b[i],b[i-1]);
            }
            else if(i!=n-1){
                a[i+1]=a[i+1]+a[i];
                b[i+1]=min(b[i],b[i+1]);
            }
        }
        printf("Case #%lld: %lld %lld\n",x++,y,z);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM/ICPC(ACM International Collegiate Programming Contest, 国际大学生程序设计竞赛)是由国际计算机界历史悠久、颇具权威性的组织ACM(Association for Computing Machinery,国际计算机协会)主办的,世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自己分析问题和解决问题的能力。该项竞赛从1970年举办至今已历29届,一直受到国际各知名大学的重视,并受到全世界各著名计算机公司的高度关注,在过去十几年中,APPLE、AT&T、MICROSOFT和IBM等世界著名信息企业分别担任了竞赛的赞助商。可以说,ACM国际大学生程序设计竞赛已成为世界各国大学生最具影响力的国际级计算机类的赛事,是广大爱好计算机编程的大学生展示才华的舞台,是著名大学计算机教育成果的直接体现,是信息企业与世界顶尖计算机人才对话的最好机会。   该项竞赛分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9~12月在各大洲举行。   ACM/ICPC的区域预赛是规模很大、范围很广的赛事。仅在2003年参加区域预赛的队伍就有来自75个国家(地区),1411所大学的3150支代表队,他们分别在127个赛场中进行比赛,以争夺全球总决赛的73个名额,其激烈程度可想而知。 2005年第30届ACM/ICPC亚洲赛区预赛共设了北京、成都、汉城、东京等11个赛站,来自亚洲各国知名高校的各个代表队进行了激烈的角逐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值