每天两道 CodeForces 构造/思维题 (day5)

简介: 每天两道 CodeForces 构造/思维题 (day5)

@[TOC]

题目1 Plus and Multiply

题目链接 Plus and Multiply

题目大意:

在这里插入图片描述

思路:构造+数学

我们可以得到n的两种表达式

  • 第一次操作是x*a : n = a^x + b * y
  • 第一次操作是x+b:n = (1 + b) * a^x + b * y ==> n = b * (a^x + y) + a^x

我们有两个未知量x和y,我们可以枚举其中一个变量,看另一个变量有没有对应的值,如果枚举y的话时间复杂度太大,而且不方便求x。所以我们可以选择枚举x,求y。

这里我们要特判a==1的情况,否则会死循环。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 1e6 + 10;
void solve()
{
    ll n, a, b;
    cin >> n >> a >> b;
    int f = 0;
    if ((n - 1) % b == 0)
    {
        f = 1;
    }
    else if (a == 1)
    {
        f = 0;
    }
    else
    {
        ll k = a;
        while (k <= n)
        {
            if ((n - k) % b == 0)
            {
                f = 1;
                break;
            }
            else
                k = k * a;
        }
    }
    if (f)
        puts("Yes");
    else
        puts("No");
    return;
}
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

题目2 Minimum Ties

题目链接 Minimum Ties

题目大意:

在这里插入图片描述

有n个球队,每个球队之间都要打一场球赛,赢得加3分,输出得0分,平局都不得分,问什么样得比赛结果能够让每个队的分数相同,并且平局数量尽可能少

思路:构造+数学

每个队之间都要打一局,那么要是每个队的分数相同,那么必须每个队赢得局数和输的局数要相同,并且能不平局就不平局。这里分两种情况

  • n 是奇数,那么每个队要打n-1场,也就是偶数场,那么可以让每个队赢输个占一半
  • n 是偶数,那么每个队就要打奇数场,所以肯定有平局,为了使平局数量最少,拿那就尽量每个人只打一场平局。并且为了使总体平局数量最小,那么只需要n/2场平局就可以了

思路已经清晰了,那么就是如何具体实现了

这里我用了一个二维数组a用来表示每局的情况

  • a[i][j]==n 表示还没有进行比赛
  • a[i][j]==0&&i!=j表示这场是平局
  • a[i][j]==0&&i==j是用来记录每个队已经获得的分数,初始为0
  • a[i][j]==1 :i 球队赢了,j 球队输了
  • a[i][j]==-1:j 球队赢了,i 球队输了

当n为偶数时,我们只需要让每个奇数球队和这个奇数+1的偶数球队打成平局就好

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 1e6 + 10;
int a[110][110];
void solve()
{
    int n;
    cin >> n;
    if (n == 2)
    {
        cout << 0 << endl;
        return;
    }
    // 初始化a数组
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            a[i][j] = n;
            if (i == j)
                a[i][j] = 0;
        }
    // 处理平局
    if (n % 2 == 0)
    {
        for (int i = 1; i <= n; i += 2)
        {
            a[i][i + 1] = 0;
            a[i + 1][i] = 0;
        }
    }
    // 处理每一场比赛
    for (int i = 1; i <= n; i++)
    {
        // a1 表示球队i赢的比赛数量,a2表示输的
        int a1 = 0, a2 = 0;
        for (int j = 1; j <= n; j++)
        {
            if (i == j)
                continue;
            if (a[i][j] == 1)
                a1++;
            else if (a[i][j] == -1)
                a2++;
            // 如果i和j还没有进行比赛,并且j的分数不小于0,并且i还可以赢
            else if (a[i][j] == n && a[j][i] == n && a[j][j] >= 0 && a1 < (n - 1) / 2)
            {
                a[i][j] = 1;
                a[i][i]++;
                a[j][i] = -1;
                a[j][j]--;
                a1++;
            }
            // 如果i和j还没有进行比赛,并且j的分数不大于0,并且i只能必须要输了
            else if (a[i][j] == n && a[j][i] == n && a[j][j] <= 0 && a2 < (n - 1) / 2)
            {
                a[i][j] = -1;
                a[i][i]--;
                a[j][i] = 1;
                a[j][j]++;
                a2++;
            }
        }
    }
    // for (int i = 1; i <= n; i++)
    // {
    //     for (int j = 1; j <= n; j++)
    //         cout << a[i][j] << " ";
    //     cout << endl;
    // }
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
            cout << a[i][j] << " ";
    }
    cout << endl;
    return;
}
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}
相关文章
|
2月前
|
存储 运维 数据可视化
2026年企业数据分析系统建设费用预算清单:详细成本解析
本文系统梳理企业数据分析系统建设的全成本构成,涵盖基础设施、软件许可、实施开发、运维支持及人员培训五大模块,并以瓴羊Quick BI为例详解其弹性计费模式与预算控制策略,助力企业制定可执行、可优化的2026年度数据分析预算清单。(239字)
|
2月前
|
人工智能 IDE JavaScript
通义灵码深度评测-企业内部使用实战
通义灵码深度评测-企业内部使用实战 ,根据企业内部使用实战,建设了微信公众号、视频号、csdn专栏,持续更新了通义灵码企业级实践教程,从入门->精通,从基本功能->高阶功能全面详尽的实战,持续更新中
574 0
|
11月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
10月前
|
安全 5G 网络安全
SD-WAN技术概述:软件定义广域网的工作原理
总结起来,Sd-wan作为一项创新技术,在现代快速变换且日益复村多样环境下提供了一个灵活高效且具有经济效益解决方案。随着数字转型趋势持续推进,Sd-wan无疑会在未来扮演更重要角色,在助力企业建立更智慧强骨干同时也促进整体行业向前发展步伐。
558 17
|
传感器 人工智能 API
通义灵码2.5深度评测:编程智能体与MCP工具的革新体验
通义灵码2.5通过“智能体+MCP”组合,重新定义了AI编码助手的边界。其价值不仅在于代码生成效率,更在于通过工具链整合和环境感知,推动开发流程向“声明式编程”演进。对于开发者而言,它既是提升效率的利器,也是探索AI辅助开发边界的实验场。
993 8
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
在操作系统中,进程间通信(IPC)是至关重要的,它提供了多种机制来实现不同进程间的数据交换和同步。本篇文章将详细介绍几种常见的IPC方式,包括管道、信号、消息队列、共享内存、信号量和套接字,帮助你深入理解并合理应用这些通信方式,提高系统性能与可靠性。
956 0
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
JavaScript
vue3完整教程从入门到精通(新人必学2,搭建项目)
本文介绍了如何在Vue 3项目中安装并验证Element Plus UI框架,包括使用npm安装Element Plus、在main.js中引入并使用该框架,以及在App.vue中添加一个按钮组件来测试Element Plus是否成功安装。
842 0
vue3完整教程从入门到精通(新人必学2,搭建项目)
|
监控 小程序 数据处理
揭秘支付宝小程序性能优化秘籍:从加载到运行,每一步都快人一步!
【8月更文挑战第27天】本文深入探讨了支付宝小程序性能优化的关键技术和策略,包括减少网络请求、利用CDN加速、代码按需加载、图片压缩、懒加载以及性能监控等多方面内容,并提供了实用的示例代码,帮助开发者显著提升小程序的加载速度与运行效率,创造更佳用户体验。
805 1
|
存储 C语言
C语言实现阶乘
C语言实现阶乘
692 0

热门文章

最新文章