2020 年百度之星·程序设计大赛 - 初赛二 题解

2023-05-16

废话

丑话说在前头,T8我不会。(没错是指我会出丑……)

T1

既然要玩尽可能多轮,那么每轮投入的钱就要最少,也就是 m m m 元,那么可以算出每轮游戏会亏损 ⌈ x × p % ⌉ \lceil x\times p\%\rceil x×p% 元,算一下可以玩几轮即可。

代码如下:

#include <cstdio>
#include <cmath>

int T,n,m,p;

int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%d %d %d",&n,&m,&p);
        int cost=ceil(1.0*m*p/100.0);
        printf("%d\n",(n-m)/cost+1);
    }
}

T2

显然将所有人排成一排距离和最小,对于每个间距,计算有多少个人计算距离时会算到这个间距,就可以知道这个间距对总和的贡献。

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100010
#define ll long long

int T,n,a[maxn];

int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        ll ans=0;
        for(int i=1;i<n;i++)ans+=1ll*i*(n-i)*(a[i+1]-a[i]);
        printf("%lld\n",ans);
    }
}

T3

这题当时把我坑惨了……行末居然不能输出 0 0 0

模拟一下即可,代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 20010

int T,n,len[maxn],pos[maxn][110],limit;
bool v[110],col[maxn];
int ans[maxn],anss;

int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%d",&n);limit=0;
        memset(col,false,sizeof(col));
        memset(pos,0,sizeof(pos));
        for(int i=1;i<=n;i++){
            scanf("%d",&len[i]);
            for(int j=1,x,y;j<=len[i];j++){
                scanf("%d %d",&x,&y),pos[i][x]=y;
                limit=max(limit,x);
            }
        }
        col[1]=true;
        for(int i=1;i<=limit;i++){
            memset(v,false,sizeof(v));
            for(int j=1;j<=n;j++)if(pos[j][i]&&col[j])v[pos[j][i]]=true;
            for(int j=1;j<=n;j++)if(pos[j][i]&&v[pos[j][i]])col[j]=true;
        }
        anss=0;
        for(int i=1;i<=n;i++)if(col[i])ans[++anss]=i;
        for(int i=1;i<anss;i++)printf("%d ",ans[i]);
        printf("%d",ans[anss]);
        printf("\n");
    }
}

T4

这题相当于要你将 10 10 10 个球放到 5 5 5 个盒子里,每个球有一个重量,令放完之后最轻的盒子重量为 k k k,要让 n − k n-k nk 最小。

比赛时, 5 10 5^{10} 510 的暴力可以以 600 m s 600ms 600ms 的速度跑过去。

但是后来去 h d u hdu hdu 上交时就不行了,大概是赛时开了O2。

这种做法复杂度大概是 9 × 1 0 6 9\times 10^6 9×106 接近 1 × 1 0 7 1\times 10^7 1×107 级别的,而正解是个二分加dp的做法,复杂度大概是 log ⁡ 2 ( 10000 ) × 10 × 3 10 ≈ 7 × 1 0 6 \log_2(10000)\times 10\times 3^{10}\approx 7\times 10^6 log2(10000)×10×3107×106

但是考虑优化一下暴力,发现假如有盒子是空的那么答案一定不是最优的,于是枚举时不考虑有空盒子的情况,那么时间复杂度就是个第二类斯特林数,由于盒子是不同的再乘一个阶乘,就是 S ( 10 , 5 ) × 5 ! ≈ 5 × 1 0 6 S(10,5)\times 5!\approx 5\times 10^6 S(10,5)×5!5×106

虽然说着很快,但实际上是压时过的……
在这里插入图片描述

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int T,n,tot[10],c[10],ans,kong=5;
void dfs(int x)
{
    if(10-x<kong)return;
    if(x==10)
    {
        int mi=999999999;
        for(int i=0;i<5;i++)mi=min(mi,c[i]);
        ans=min(ans,n-mi);
        return;
    }
    for(int i=0;i<5;i++){
        if(!c[i])kong--;c[i]+=tot[x];
        dfs(x+1);
        c[i]-=tot[x];if(!c[i])kong++;
    }
}

int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%d",&n);
        char s[10];
        memset(tot,0,sizeof(tot));
        for(int i=1;i<=n;i++)scanf("%s",s),tot[s[4]-'0']++;
        ans=999999999;dfs(0);
        printf("%d\n",ans);
    }
}

T5

考虑费用流,人的口味可以分为六种,分别统计出数量然后建图,二分图左边是三种饮料,右边是六种人,中间的边费用对应题中的欢乐值,那么答案就是最大费用最大流。

代码如下:

#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 110
#define inf 999999999

int test,n,c[4],S,T;
struct edge{int x,y,z,cost,next;}e[maxn<<3];
int first[maxn],len;
void buildroad(int x,int y,int z,int cost){e[++len]=(edge){x,y,z,cost,first[x]};first[x]=len;}
void ins(int x,int y,int z,int cost){buildroad(x,y,z,cost);buildroad(y,x,0,-cost);}
map<string,int>mp;
map<int,string>MP;
int tot[maxn];
int q[maxn],st,ed,dis[maxn],fa[maxn];
bool v[maxn];
bool SPFA()
{
    for(int i=1;i<=T;i++)fa[i]=0,dis[i]=-inf;
    st=1;ed=2;q[st]=S;v[S]=true;dis[S]=0;
    while(st!=ed){
        int x=q[st++];st=st>maxn-10?1:st;v[x]=false;
        for(int i=first[x];i;i=e[i].next){
            int y=e[i].y;
            if(e[i].z&&dis[y]<dis[x]+e[i].cost){
                dis[y]=dis[x]+e[i].cost;fa[y]=i;
                if(!v[y])v[q[ed++]=y]=true,ed=ed>maxn-10?1:ed;
            }
        }
    }
    return fa[T];
}

int main()
{
    mp["012"]=1;mp["021"]=2;mp["102"]=3;mp["120"]=4;mp["201"]=5;mp["210"]=6;
    MP[1]="012";MP[2]="021";MP[3]="102";MP[4]="120";MP[5]="201";MP[6]="210";
    scanf("%d",&test);while(test--)
    {
        scanf("%d %d %d %d",&n,&c[1],&c[2],&c[3]);
        memset(tot,0,sizeof(tot));string s;
        for(int i=1;i<=n;i++)cin>>s,tot[mp[s]]++;
        
        memset(first,0,sizeof(first));len=1;S=10;T=11;
        for(int i=1;i<=3;i++)ins(S,i,c[i],0);
        for(int i=1;i<=6;i++){
            s=MP[i];
            ins(s[0]-'0'+1,i+3,inf,3);
            ins(s[1]-'0'+1,i+3,inf,2);
            ins(s[2]-'0'+1,i+3,inf,1);
            ins(i+3,T,tot[i],0);
        }
        
        int ans=0; while(SPFA())
        {
            int min_flow=inf;
            for(int i=fa[T];i;i=fa[e[i].x])
            min_flow=min(min_flow,e[i].z);
            for(int i=fa[T];i;i=fa[e[i].x])
            e[i].z-=min_flow,e[i^1].z+=min_flow,
            ans+=e[i].cost*min_flow;
        }
        printf("%d\n",ans);
    }
}

T6

贪心思路是很容易看出来的,只是实现需要细致一些。

最优的方法肯定是两边的杆在最上面放,一路放下来,然后在下面的杆上放尽可能多。

但是也要考虑下面的杆长度比 x x x 小的情况,那么就是两边的杆交替放,具体细节可以看代码:

#include <bits/stdc++.h>
using namespace std;

int T;
double a,b,x;

int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%lf %lf %lf",&a,&b,&x);
        if(x>b)
        {
            double c=sqrt(x*x-b*b);
            if(2*c<x){
                int k=floor(a/x);int ans=2*k+1;
                double X=a-k*x,Y=X-(x-c);
                if(X>=c)ans++,Y=X-c;
                if(sqrt(x*x-X*X)+sqrt(x*x-Y*Y)<=b)ans++;
                printf("%d\n",ans);
            }
            else printf("%d\n",(int)(a/c)+1);
        }
        else
        {
            int ans1,ans2;
            ans1=(int)(a/x)+1;
            double c=a-1.0*(ans1-1)*x;
            c=sqrt((double)(x*x-c*c));
            if(b-c*2>=x)ans2=(int)((b-c*2-x)/x)+2;
            else if(b-c*2>=0)ans2=1;
            else ans2=0;
            printf("%d\n",ans1*2+ans2);
        }
    }
}

T7

可以发现,Alice写完的题,肯定都是在Bob也写完后才交,这样Bob浪费最多时间,所以Bob做完第 i i i 题的时刻一定是 ∑ j = 1 i b [ j ] \sum_{j=1}^i b[j] j=1ib[j],假如Alice写完第i题后的时刻Bob已经写完了,那么Alice肯定不写这题,那么就是个简单的dp了。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 2010
#define ll long long
#define inf 999999999999999999ll

int T,n;
ll a[maxn],b[maxn],f[maxn][maxn];//f[i][j]表示前i题中Alice做完其中j题后的最小时刻

int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)f[i][j]=inf;
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++)scanf("%lld",&b[i]),b[i]+=b[i-1];
        f[0][0]=0;
        for(int i=1;i<=n;i++){
            for(int j=i;j>=0;j--){
                f[i][j]=f[i-1][j];
                if(j>0&&f[i-1][j-1]+a[i]<=b[i])//假如Alice做完这题后Bob还没做完
                f[i][j]=min(f[i][j],f[i-1][j-1]+a[i]);
            }
        }
        for(int i=n;i>=0;i--)if(f[n][i]<inf){printf("%d\n",i);break;}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020 年百度之星·程序设计大赛 - 初赛二 题解 的相关文章

  • CF 1000F One Occurrence

    传送门题目大意思路参考代码总结 时光如梭 xff0c Codeforces 的题号还是三位数的时代已经过去 xff1b 量子语言原来已经来临 传送门 题目大意 给定一个长度为 n n 的序列 a a xff0c 有 m m 个
  • CF 993E Nikita and Order Statistics

    传送门题目大意思路参考代码 传送门 题目大意 给你一个数组 a 1 n a 1 n xff0c 对于 k 61 0 n
  • CF 997A Convert to Ones

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个长度为 n n 3 10 5 n n 3 10
  • CF 997B Roman Digits

    传送门题目大意思路参考代码总结 传送门 题目大意 现在规定罗马数字只有 4 4 个字符 I V X L 分别代表 1 1 5 5 10 10 50 50
  • CF 997C Sky Full of Stars

    传送门题目大意思路参考代码总结 传送门 题目大意 有一个 n n n 10 6 n n n 10
  • CF 997D Cycles in product

    传送门题目大意思路参考代码总结Remarks参考代码 传送门 题目大意 给你大小分别为 n 1 n 1 和 n 2 n 2
  • NOI 2018 游记

    Day 2Day 1Day 0Day 1Day 2Day 3Day 4Day inftyDay 5 Day 2 昨天打完了最后一个一场模拟赛 xff0c 又垫底啦 xff01 本来之前我很少垫底的 xff0c 不知道为什么最后四场模拟赛一直
  • MySQL集群架构

    第1节 集群架构设计 在集群架构设计时 xff0c 主要遵从下面三个维度 xff1a 可用性 扩展性 一致性 1 1 可用性设计 站点高可用 xff0c 冗余站点 xff1b 服务高可用 xff0c 冗余服务 xff1b 数据高可用 xff
  • CF 1008D Pave the Parallelepiped

    传送门题目大意 样例输入样例输出样例解释 思路参考代码总结 传送门 题目大意 给你一个 A B C A B C 的长方体 xff0c 你要把它切成很多块大小都是 a b c
  • Direct2D 学习笔记

    文章目录 Direct2DD2D 是什么D2D 适合谁开发环境发布平台入门我能找到例子吗一 第一个 D2D 程序 Hello Direct2D1 工厂2 呈现器3 渲染4 运行结果 二 Direct2D 画图实践 Random Graphi
  • Python 学习笔记——入门

    文章目录 Python 是什么一 推荐的教程二 这篇学习笔记适合什么人三 环境1 操作系统对于 Windows对于 Ubuntu对于其他操作系统 2 Python对于 Windows安装步骤1 下载2 安装 测试是否成功安装退出 Pytho
  • CF 1166A Silent Classroom

    文章目录 传送门题目大意思路别人的思路参考代码Python 学习笔记 传送门 题目大意 有 n n 100
  • SHGetKnownFolderPath function

    原文 SHGetKnownFolderPath 通过一个 KNOWNFOLDERID 标志获取对应已知文件夹的完整路径 Retrieves the full path of a known folder identified by the
  • WM_DPICHANGED message

    原文 WM DPICHANGED message 当窗口的 DPI 改变时将收到此消息 DPI 是窗口的缩放比例 有多种情况会导致 DPI 改变 xff0c 如下表列出 xff1a 窗口被移动到有不同 DPI 的显示器 窗口所在显示器的 D
  • WSL运行python程序关于路径的坑

    安装了wsl xff08 Windows下的Linux子系统 xff09 xff0c 跑python代码时 xff0c 发现路径有问题 总结来说 xff0c 如果是跑linux里的代码 xff0c 那么其中的绝对路径就按linux的地址解析
  • 【基础编程题】Java基础====键盘输入学生成绩,计算后按总分高低顺序存入磁盘文件txt

    要求 xff1a 有五个学生 xff0c 每个学生有3门课程的成绩从键盘输入以上数据 xff08 包括姓名 xff0c 三门课成绩 xff09 输入的格式 xff1a 如 xff1a zhangsan 30 40 60计算出总成绩 xff0
  • MySQL 配置文件位置及命名。

    MySQL 配置文件位置及命名 使用 mysqladmin 或 mysql xff0c 会提示 MySQL 加载配置文件的顺序及文件命名规范 span class token keyword Default span options are
  • Codeforces 1419B. Stairs 递归

    Codeforces 1419B Stairs 递归 原题链接https codeforces com problemset problem 1419 B 样例 输入 5 2 1 49 5 20 50 6 20 50 5 3 8 9 13
  • dos中定义变量与引用变量以及四则运算

    在dos中使用set定义变量 xff1a set a 61 8 注意等号两边没有空格 引用变量如 xff1a echo a 将打印a的值 dos中要使用算术运算 xff0c 需要使用 set 命令 xff1a set a val 61 3
  • Python将计算结果拷贝至粘贴板

    前言 xff1a 我们知道在使用ctrl 43 c复制文字时 xff0c 实际是将文字复制到了粘贴板中 xff08 内存 xff09 xff0c 而在实际应用中 xff0c 除了将Python的计算结果打印外 xff0c 有时还想进行自动复

随机推荐

  • Java反射——通过Java反射机制设置属性值

    本示例使用Java反射机制分别设置当前类的private public属性以及其父类的private属性来说明如何通过Java反射机制设置属性值 xff08 注 xff1a 设置继承的父类属性时 xff0c 无法通过当前类的Class对象直
  • 7-9 选择法排序之过程 (15 分)

    7 9 选择法排序之过程 15 分 本题要求使用选择法排序 xff0c 将给定的n个整数从小到大排序后输出 xff0c 并输出排序过程中每一步的中间结果 选择排序的算法步骤如下 xff1a 第0步 xff1a 在未排序的n个数 xff08
  • Debian配置清华源

    确定debian的系统版本 plc 64 debian cat etc os release PRETTY NAME 61 34 Debian GNU Linux 9 stretch 34 NAME 61 34 Debian GNU Lin
  • AAC音频编码格式介绍

    一 概述及分类 AAC Advanced Audio Coding 的缩写 xff0c 中文称为 高级音频编码 xff0c 被手机界称为 21世纪数据压缩方式 xff0c AAC所采用的运算方式是与MP3的运算有所不同 xff0c AAC同
  • Ubuntu系统失败之----安装U盘不能存放其它文件

    Ubuntu安装失败的经验贴 背景 xff1a 笔者在数月之前制作了一个Ubuntu 14 4系统安装盘 xff08 当时把U盘格式化 制作了引导并且拷贝了镜像 xff09 U盘的特点是除了系统相关文件之外没有其它任何文件 当时在三台联想笔
  • 结构体sizeof不想字节对齐

    问题描述 xff1a 笔者在做一个项目 xff1a 硬件要访问内存中按照Spec格式定义 的一段数据包 在C语言中一般使用结构体初始化这个数据包 xff0c 因为可以方便配置各个字段 但结构体默认需要字节对齐的 xff08 sizeof和实
  • C/C++语言static修饰函数的作用

    描述 xff1a 在C C 43 43 语言程序中 xff0c 特别是的大型程序 xff0c 函数名前往往用static关键词修饰 作用 xff1a 主要的作用是避免命名冲突 static函数与一般函数作用域不同 xff0c 仅在本文件有效
  • ubuntu16.04升级18.04(再次作死)

    继上次升级glibc版本作了一次大死后 xff0c 手又痒了 xff0c 又觉得我可以了 来继续升级ubuntu16 04升级到 ubuntu18 04 最主要的原因是ubuntu自带的python只到了3 5的版本 而我需要python3
  • 初始C语言——统计字符串中的字母,数字和其他符号 的个数

    define CRT SECURE NO WARNINGS 1 防止visual studio2013以上版本scanf报错 xff0c vc6 0环境可忽略 include lt stdio h gt int main int a 61
  • Linux下开发调试中大型C语言代码-如何提高效率

    背景 xff1a 在Linux下开发中大型C语言程序 xff08 包括编写 编译调试等步骤 xff09 时 xff0c 尤其大部分代码都是原创的情况下 以下的经验往往能提高调试效率 经验 xff1a xff08 1 xff09 Linux命
  • 《C语言中分配了动态内存后一定要释放吗?》

    问 xff1a 比如main函数里有一句 malloc 后面没有free 1 那么当main结束后 xff0c 动态分配的内存不会随之释放吗 xff1f 2 如果程序结束能自动释放 xff0c 那么还加上free xff08 xff09 x
  • Qemu使用心得

    使用Qemu的心得体会如下 xff1a xff08 1 xff09 在QEMU源码中增加自己的 c实现 xff0c 编译后出现很多个错误如 xff1a error storage class specified for parameter
  • 转载:malloc和free底层实现

    转载 xff1a malloc和free底层实现 内存管理内幕 Linux内存管理 xff1a Malloc 本文引用了下面这篇文章 xff0c 读完下面 xff0c 应该读下上面两篇文章 xff0c 其中 xff0c 内存管理内幕 提供了
  • qemu tcg代码执行流程

    转自 xff1a http blog csdn net alloc7 article details 7719823 一 qemu简介 qemu是使用动态二进制翻译的cpu模拟器 xff0c 它支持两种运行模式 xff1a 全系统模拟和用户
  • c语言如何调用c++(本文从qemu开发中总结)

    背景 xff1a 有时候一个工程中有c语言编写的代码 c xff0c 也有c 43 43 cpp 编写的 xff0c 分别用 xff43 语言编译器 xff08 这里指 xff47 xff43 xff43 xff09 和 xff43 xff
  • c++常错语法

    1 new T 代表创建一个T类的对象指针 xff0c new T 标识创建T类对象数组指针 2 template模板类只能把成员函数都定义在 h中 xff0c 分开 h和 cpp会报链接错误 3 类A 的成员变量包含B的对象B b xff
  • UEFI EDK2开发环境设置关键点/修改环境变量

    1 问题描述 Linux下当修改了已经编译过的EDK2工程顶层路径后 进入工程顶层路径source edksetup sh会报错 2 解决步骤 有一个隐藏问题非常容易被忽视 那就是EDK2工程的环境变量可能还是原来的旧的 这时候 1 进入工
  • linux静态库.a使用常见错误

    在linux中如果一个程序需要用到 a 有以下几点需要注意 1 如果x o与y o中用到了静态xx a中的函数 不能用gcc xx a o test x o y o这种方式编译 会提示那些函数undefined 正确的做法是gcc o te
  • C/C++多线程常见问题

    1 问题 1 1 创建线程后是否立马开始并行执行 答 主线程创建了子线程之后 后者并不是立即就开始运行了 至少在Linux操作系统下 1 子线程和主线程运行在一个core上 那还需要等待主线程交出core控制权 可能是时间片耗尽 2 子线程
  • 2020 年百度之星·程序设计大赛 - 初赛二 题解

    废话 丑话说在前头 xff0c T8我不会 xff08 没错是指我会出丑 xff09 T1 既然要玩尽可能多轮 xff0c 那么每轮投入的钱就要最少 xff0c 也就是 m m m 元 xff0c 那么可以算出每轮游戏会亏损