【CSDN竞赛第70期】

1、题目名称:小张的手速大比拼
题目
在很久很久以前,小张找到了一颗有 N 个节点的有根树 T 。 树上的节点编号在 1 到 N 范围内。 他很快发现树上的每个节点 i 都有一个对应的整数值 V[i]。 一个老爷爷对他说,给你一个整数 X, 如果你能回答我的 M 个问题,他就给张浩扬购买一些零食。 对于每个问题 Q[i], 请你找到 在 T 中以节点 Q[i] 为根的子树中的所有节点(包括 Q[i])中, 有没有两个节点 A, B (A != B) 的值 V[A] ^ V[B] 的异或和为 X。 如果有这样的两个节点, 请你输出 YES。 否则你需要输出 NO 表示没有节点符合上面的条件。
不太懂

2、题目名称:坐公交
题目
        公交上有N 排凳子,每排有两个凳子,每一排的凳子宽度不一样。有一些内向和外向的人按照顺序上车。 外向的人(0 ):只会选择没人的一排坐下,如果有很多排符合要求,他会选择座位宽度最小的坐下。 内向的人( 1 ):只会选择有 人的一排坐下,如果有很多排符合要求,他会选择座位宽度最大的坐下。 数据保证存在合理。输出每个人所在的排。

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

struct Item {
    int index;
    int length;
    Item(int i, int len) : index(i), length(len) {}
};

struct Compare {
    bool operator()(const Item& a, const Item& b) {
        return a.length > b.length;
    }
};

int main() {
    int n;
    cin >> n;

    vector<Item> items;
    for (int i = 1; i <= n; i++) {
        int len;
        cin >> len;
        items.push_back(Item(i, len));
    }

    sort(items.begin(), items.end(), [](const Item& a, const Item& b) {
        return a.length < b.length;
    });

    string s;
    cin >> s;

    int pos = 0;
    priority_queue<Item, vector<Item>, Compare> pq;
    for (int i = 0; i < n * 2; i++) {
        if (s[i] == '0') {
            ++pos;
            cout << items[pos - 1].index << " ";
            pq.push(items[pos - 1]);
        } else {
            Item curr = pq.top();
            pq.pop();
            cout << curr.index << " ";
        }
    }

    return 0;
}

3、题目名称:三而竭
题目
        一鼓作气再而衰三而竭。 小艺总是喜欢把任务分开做。 小艺接到一个任务,任务的总任务量是n 。 第一天小艺能完成 x 份任务。 第二天能完成x/k...  第 t 天能完成 x/(k^(t-1)) 。 小艺想知道自己第一天至少完成多少才能完成最后的任务。

【输入描述】
第一行输入整数 n,k 。

【输出描述】
输出 x x的最小值。

【输入样例】
59 9
【输出样例】
54
 

# 请关闭中文输入法,用英文的字母和标点符号。
# 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮,
# 注意:除答案外,请不要打印其他任何多余的字符,以免影响结果验证
# 本OJ系统是基于 OxCoder 技术开发,网址:www.oxcoder.com
# 模版代码提供基本的输入输出框架,可按个人代码习惯修改


class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n):
        result = None

        # TODO: 请在此编写代码
        k = n[1]
        n = n[0]
        x = (n * (k-1) // k) + 1

        while True:
            summ = 0
            t = 1
            while True:
                task = x//(k**(t-1))
                if task >= 1:
                    summ += task
                else:
                    break
                t += 1
            if summ >= n:
                break
            else:
                x += 1

        result = x
        return result

if __name__ == "__main__":
    n = [int(item) for item in input().strip().split()]
    s = Solution()
    result = s.solution(n)
    print(result)

4、题目名称:争风吃醋的豚鼠

题目

        N个节点两两建边。 不存在 3 个节点相互之前全部相连。 (3 个节点连接成环 ) 最多能建立多少条边?

将数据分成2组数据相乘即可,同组内所有数据都与另一组相连可能最大数,同组内不可相连。
说明:由于A1跟A2都与BX相连,则A1跟A2相连就会有闭环A1A2BX
4个点时 A1 B1 A2 B2有
A1->B1 A1->B2
A2->B1 A2->B2
共4条
5个点时 A1 B1 A2 B2 A3有
A1->B1 A1->B2
A2->B1 A2->B2
A3->B1 A3->B2
共6条
 

#include <stdio.h>
#include <stdlib.h>
void solution(int n) {
	int a=n/2;
	int b=n-a;
	printf("%d",a*b);
}
int main() {
	int n;
	scanf("%d", &n);
	solution(n);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code Slacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值