题解系列016 + 比赛系列005 | CSDN 第十六届编程竞赛题解 + 建议

一、总体情况

得分:25+25+25+17.5=92.5(排名第4)

二、题目分析

第一题

题目

鬼画符门莲台争夺战!虽然鬼画符门是一个三流门派但是近期为了改善宗门弟子质量。 特意引进了进化莲台。部分精英弟子会自己独占一块区域,或者几个精英弟子一块占领一块区域,他们占领的区域普通弟子不可以再占领,小艺作为普通 弟子想知道自己还能占领哪些地方。莲台区域以1开始,由小到大编号表示。

分析

较为容易,用 for 循环一次检验每个单元格是否被占据即可。

代码
class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n, m, vector):
        result = [0, []]

        occupied = []
        
        for vec in vector:
            for i in range(vec[0], vec[1]+1):
                if i not in occupied:
                    occupied.append(i)
        cnt = 0
        for i in range(1, m+1):
            if i not in occupied:
                result[1].append(i)
                cnt = cnt+1

        result[0] = cnt
        return result
    

if __name__ == "__main__":


    
    arr_temp = [int(item) for item in input().strip().split()]
    
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    
    vector = []
    for i in range(n):
        vector.append([int(item) for item in input().strip().split()])
    
    
    sol = Solution()
    result = sol.solution(n, m, vector)

    print(f"{result[0]}")
    for i in result[1]:
        print(i,end=' ')

第二题

题目
题目描述

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20 % 20\% 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 100 100 元或恰好 100 100 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如 11 11 11月初津津手中还有 83 83 83 元,妈妈给了津津 300 300 300 元。津津预计 11 11 11月的花销是 180 180 180 元,那么她就会在妈妈那里存 200 200 200 元,自己留下 183 183 183 元。到了 11 11 11 月月末,津津手中会剩下 3 3 3 元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据 2004 2004 2004 1 1 1 月到 12 12 12 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 2004 2004 年年末,妈妈将津津平常存的钱加上 20 % 20\% 20% 还给津津之后,津津手中会有多少钱。

输入格式

12 12 12 行数据,每行包含一个小于 350 350 350 的非负整数,分别表示 1 1 1 月到 12 12 12 月津津的预算。

输出格式

一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 − X -X X X X X 表示出现这种情况的第一个月;否则输出到 2004 2004 2004 年年末津津手中会有多少钱。

分析

这是一道模拟问题,依次对每个月枚举即可。

代码
#include<iostream> 
using namespace std;
int main()
{
    int arr[12], i, a = 0, b = 0;
    for (int i = 0; i <= 11; i++)
        cin >> arr[i];
    for (int i = 0; i <= 11; i++)
    {
        a = ((b + 300 - arr[i]) / 100) * 100 + a; // 存的钱
        b = (b + 300 - arr[i]) - (b + 300 - arr[i]) / 100 * 100; // 剩下的钱
        if (b < 0)
        {
            cout << "-" << i + 1;
            return 0;
        }
    }
    cout << a * 1.2 + b << endl;
    return 0;
}

第三题

题目
题目描述

给出一个没有缺口的简单多边形,它的边是垂直或者水平的,要求计算多边形的面积。

多边形被放置在一个 x − y x-y xy 的笛卡尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数,因此多边形的面积也为整数。

输入格式

第一行给出多边形的顶点数 n n n

接下来 n n n 行,每行给出多边形一个顶点的坐标值 x x x y y y,用空格隔开。

顶点按逆时针方向逐个给出。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。

输出格式

一行,一个整数,表示多边形的面积。

分析

注意到以原点 O ( 0 , 0 ) , A ( x 1 , y 1 ) , B ( x 2 , y 2 ) O\left( 0,0 \right) ,A\left( x_1,y_1 \right) ,B\left( x_2,y_2 \right) O(0,0),A(x1,y1),B(x2,y2) 为三顶点的三角形面积为 S △ O A B = 1 2 ⋅ ∣ x 1 y 2 − x 2 y 1 ∣ S_{\bigtriangleup OAB}=\frac{1}{2}\cdot |x_1y_2-x_2y_1| SOAB=21x1y2x2y1(同时带有向面积), 而题目的特殊条件(凸多边形;逆时针排列)也告诉我们只要正常顺序 for 循环计算每一块的有向面积即可:
S = ∑ S i = ∑ x [ i ] y [ i + 1 ] − x [ i + 1 ] y [ i ] 2 S=\sum{S_i}=\sum{\frac{x\left[ i \right] y\left[ i+1 \right] -x\left[ i+1 \right] y\left[ i \right]}{2}} S=Si=2x[i]y[i+1]x[i+1]y[i]

代码
#include <iostream>
#include <cmath>
using namespace std;

int x[105], y[105];

int main()
{
	int n, s = 0;
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> x[i] >> y[i];
	x[n + 1] = x[1];
	y[n + 1] = y[1];
	for (int i = 1; i <= n; i++)
		s += (x[i] * y[i + 1] - x[i + 1] * y[i]);
	cout << abs(s) / 2;
	return 0;
}

第四题

题目

n × m n\times m n×m 的地图上,存在一个喷水点,如果相邻的位置低于有水的地方,水就能流到相邻的某位置(即该格子需要其上下左右的格子海拔都比自身高的封闭图形才可以积水)。 已知各个格子的海拔高度,求积水的最大覆盖个格子数。

说明

本人赛时没有完全 AC,赛后看了题解做出来了,在此放上参考的那篇题解:链接1链接2


欢迎关注我的博客!
我的 GitHub 账号: 欢迎 Fork + PR!
我的洛谷账号:这是我
我的洛谷团队:这是我的团队
欢迎大家关注我,在项目上与我协作哦!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值