2023寒假算法集训营1

news/2024/11/19 12:36:48/

A. World Final? World Cup! (I) (模拟、枚举)

题意:

给定一个长度为 10 的01串,表示 A、B 双方的点球情况,1 表示罚进,0 表示罚不进。

A 先手,交替罚点球,各罚五次。

得分多者获胜。若在罚完某个球后,后续的罚球无论如何都不会影响最终的结果,则比赛结束。

判断会在踢完第几个球时结束,若踢满 10 球仍未分出胜负则输出 -1.

思路:

依次枚举,每次记录下当前的得分,然后分别假设 A 和 B 在最优情况下的后续得分(即后面每次点球都罚进),再将情况合并后判断能否分出胜负。

AB 分别表示当前 A 和 B 的得分, Abest 表示 A 的最优情况,Bbest 表示 B 的最优情况,两者得分相减,可得到两个式子:

对于 A :后面 A 全罚进,B 全罚不进,即 (A + Abest) - B

对于 B :后面 B 全罚进,A 全罚不进,即 (B + Bbest) - A

如果能分出胜负,那么就 有一方即使在最优情况下的最终得分也没有对方高

即两式之间必有一个 <0 ,相乘后判断结果即可。

代码:

#include <bits/stdc++.h>
using namespace std;void solve()
{string s;cin >> s;s = ' ' + s;int A = 0, B = 0;for (int i = 1; i <= 10; i++){if (s[i] == '1'){if (i % 2) A++;else B++;}int Abest = (10 - i) / 2, Bbest = (11 - i) / 2;if ((A + Abest - B) * (B + Bbest - A) < 0){cout << i << endl;return;}}cout << -1 << endl;
}int main()
{int t;cin >> t;while (t--){solve();}return 0;
}

C. 现在是,学术时间 (I)(思维 + 贪心)

题意:

教授发表论文,定义 H 表示 ”该教授发表的所有论文中,有至少 HHH 篇论文的引用量大于等于 HHH “。

给定 n 位教授,和长度为 n 的数组,表示每个人的引用量,每人都有一篇写好的论文未发表。

规定每篇论文只能被一位教授发表,一位教授可以发表多篇论文。

求重新分配每个教授发表的论文数后,所有教授的 H 指数之和的最大值。

思路:

分析 H 的定义,换句话来说,就是如果引用量不为 0 的话,则至少有 1 篇论文的引用量大于等于 1,即 H 表示最小值,如果这个人论文的引用量不为 0,其 H 指数为 1.

再根据其定义,发现 H 不可能多于总的引用非0论文数,所以最好的分配方案就是不分配。

依次枚举,如果引用量非0,则 H + 1,否则就跳过。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;void solve()
{int n;cin >> n;int res = 0;for (int i = 1; i <= n; i++){int x;cin >> x;if (x) res ++;}cout << res << endl;
}int main()
{int t;cin >> t;while (t--){solve();}return 0;
}

D. 现在是,学术时间 (II)(贪心 + 数学 + 分类讨论)

题意:

在第一象限内给定两个坐标 (x, y) 和 (xp, yp),其中第一个表示由 (0, 0), (x, y) 两点确定的目标框,第二个表示由 (xp, yp) 和某个点确定的预测框。

要求 目标框和预测框两个矩形交集部分的面积除以并集部分的面积的最大值。

思路:

要使情况最优,则预测框的另一个顶点一定是目标框的四个顶点 ABCD 之一。

可以以点 (x, y) 为中心,分为 ”左上、右上、左下、右下“ 四个部分分类讨论,取最大值。

如下图所示:
在这里插入图片描述

  1. 左下,即目标框内部:
    枚举 A、B、C、D 作为另一顶点的四种情况,取最大值。

  2. 左上:
    枚举 A、B 作为另一顶点的两种情况,取最大值。

  3. 右上:
    取 A 作为另一顶点。

  4. 右下:
    枚举 A、D 作为另一顶点的两种情况,取最大值。

代码:

#include <bits/stdc++.h>
using namespace std;int x, y, xp, yp;void solve()
{cin >> x >> y >> xp >> yp;double res = 0;if (xp <= x && yp <= y)  //左下{res = max(res, 1.0 * (xp * yp) / (x * y));  //Ares = max(res, 1.0 * (x - xp) * yp / (x * y));  //Bres = max(res, 1.0 * (x - xp) * (y - yp) / (x * y));  //Cres = max(res, 1.0 * (xp) * (y - yp) / (x * y));  //Dprintf("%.9f\n", res);return;}if (xp <= x)  //左上{res = max(res, 1.0 * (xp * y) / (x * y + xp * (yp - y)));  //Ares = max(res, 1.0 * (x - xp) * y / (x * y + (x - xp) * (yp - y)));  //B        printf("%.9f\n", res);return;}if (yp <= y) //右下{res = max(res, 1.0 * (x * yp) / (x * y + (xp - x) * yp));  //Ares = max(res, 1.0 * (x) * (y - yp) / (x * y + (xp - x) * (y - yp)));  //Dprintf("%.9f\n", res);return;}//右上res = max(res, 1.0 * (x * y) / (xp * yp)); //Aprintf("%.9f\n", res);
}int main()
{int t;cin >> t;while (t--){solve();}return 0;
}

H. 本题主要考察了DFS(思维)

题意:

有一个拼图游戏,由 n × n 个大小为 1 × 1 的拼图块组成,每个拼图块都是在正方形的 1 × 1 拼图块基础上生成的

生成方法为:对于每一条边,可以选择不变、向里削出一个半圆形的缺口、向外补上一个半圆形的凸出三种操作之一。

因此,一个拼图块可以由一个长度为 4 的字符串描述,四个字符分别表示上、右、下、左四条边进行的操作,上述三种操作依次记 0, 1, 2.

如下图所示:
在这里插入图片描述
每块拼图还有一个制作成本 p ,制作成本正比于面积,而拼图中削去的缺口和补上的凸出面积又相同,因此对于一块削去了 x 个半圆、补上了 y 个半圆的 1 × 1 拼图,其制作成本 p = 10 − x + y 。如上图中拼图的成本为 p = 10 − 1 + 1 = 10

现给出 n × n - 1 块表示拼图形状的字符串,要求出缺少的那块拼图的制作成本。

思路:

观察一下就会发现,所有小拼图组成一块大拼图,每块小拼图的形状都不一样,但是组成的大拼图一定是个正方形,其中的小拼图每条边都可能存在互补关系,缺口可由凸口补上。

因为 拼图总成本 = 给出拼图的成本 + 缺失拼图的成本,且大拼图总成本为 10n210n^210n2 .

所以要求缺少的拼图的成本,只需 用总成本减去已知拼图的成本 即可。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 10;void solve()
{int n;cin >> n;int res = 10 * n * n;for (int i = 1; i <= n * n - 1; i++){string s;cin >> s;int x = 0, y = 0;for (int j = 0; j < 4; j++){if (s[j] == '1') x++;if (s[j] == '2') y++;}res -= (10 - x + y);}cout << res << endl;
}int main()
{int t;cin >> t;while (t--){solve();}return 0;
}

L. 本题主要考察了运气(数学期望)

题意:

给定 5 个团体,每个团体都有 4 个人。

要求找到一个人,问在最优策略下,需要猜多少次,输出期望次数。

有 100 个选项,编号从 1 至 100,第 iii 个选项为 3.45+0.05∗i3.45+0.05*i3.45+0.05i ,输出与答案最接近的选项编号。

思路:

因为每个团、每个人之间都一样,所以最佳策略就是依次猜,先猜出团,再猜出团里的人。

先猜团:5 个团,第一次猜中的概率为 0.2,第二次为 0.2,第三次为 0.2,第四次为 0.4 .

再猜团:4 个人,第一次猜中的概率为 0.25,第二次为 0.25,第三次为 0.5 .

再用计算数学期望的方法计算一下,得到最终答案为:

  0.2 × 1 + 0.2 × 2 + 0.2 × 3 + 0.4 × 4
+ 0.25 × 1 + 0.25 × 2 + 0.5 × 3
= 5.05

5.05=3.45+0.05×i5.05 = 3.45 + 0.05 \ × \ i5.05=3.45+0.05 × i ,得 i=32i = 32i=32 .

代码:

#include <bits/stdc++.h>
using namespace std;int main()
{cout << 32 << endl;return 0;
}


http://www.ppmy.cn/news/18846.html

相关文章

1月22日,30秒知全网,精选7个热点

///春节假期西南钢厂检修、停产计划增多 钢厂方面&#xff0c;本周西南钢厂检修、停产计划继续增加&#xff0c;四川、重庆、云南、贵州钢厂产量均小幅减少。本周西南钢厂螺纹钢产能利用率50.49%&#xff0c;环比下降8.04%&#xff1b;开工率46.94%&#xff0c;环比下降10.2%&…

ffmpeg 批处理截取片头片尾

比如其中一个视频文件总时长为 00:55:09.095 含有片头2分 13秒150毫秒 00:02:13.150 含有片尾3分 13秒030毫秒 00:03:13.030 获得了视频时间&#xff0c;计算和分割不知道怎么弄了 CD /D "%~dp0" echo off&title ffmpeg获取视频时间 for %%a in (*.avi *.mkv *…

Windows 服务器刷题(2)(带答案)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.刷题 前言 本章将会讲解Windows服务器刷题(2) 一.刷题 1.[多选题]以下哪些级别是Windows Server 2016日志事件包…

Linux下的进程信号

目录 信号背景&#xff1a; 信号产生前 Core Dump 信号产生中 信号产生后 其他概念 不可重入函数 volatile关键字 SIGCHLD 17号信号 信号背景&#xff1a; 在生活中处处都存在的信号&#xff0c;比如信号灯&#xff0c;要想处理信号&#xff0c;我们就必须具备两种…

2022年终总结——从打工到创业的转折

目录一、机会的创造和紧抓二、时间线的诉说1.1-4月份&#xff0c;在外面工作的过程中也在考虑这个事情&#xff1b;是在一个自己刚熟悉的金融行业学习提升&#xff1f;还是回归到自己铺垫了很久的教育行业深耕&#xff1f;2.5月份&#xff0c;孤身一人奔赴创业之路&#xff1b;…

c#定制操作Excel--com组件(共3种方法)

一、借助第三方插件 1、新建项目并引用》com组件》excel libary 或者时使用第三方开源freespire.xls Workbook book new Workbook();Worksheet sheet book.Worksheets[0];sheet.Name "First Page";sheet.Range[1, 1].Text "我的销售额 2019";sheet…

【手把手教你学51单片机】中断的优先级

注&#xff1a;本文章转载自《手把手教你学习51单片机》&#xff01;因转载需要原文链接&#xff0c;故无法选择转载&#xff01; 如若侵权&#xff0c;请联系我进行删除&#xff01;上传至网络博客目的为了记录自己学习的过程的同时&#xff0c;同时能够帮助其他一同学习的小伙…

一期每日一GO群分享-flag、viper、协程池、异常处理

1.11 flag库 今天介绍一个库flag&#xff0c;命令行程序常用&#xff0c;用来接受参数的。 var (intflag intboolflag boolstringflag string )func init() {flag.IntVar(&intflag, "intflag", 0, "int flag value")flag.BoolVar(&boolflag, &qu…