Codeforces Round #292 (Div. 2) A,B,C,D 题解

Drazil提出了一系列编程难题,包括日期选择、朋友匹配、数字操作与布局设计等。文章详细阐述了解决每道题目的核心思路,如通过数学判断是否能够达到特定条件、利用贪心算法与深度优先搜索解决复杂布局问题。每个挑战都有具体的输入输出说明及示例,旨在展示编程技巧与逻辑思维。
<span style="font-size:14px;">这么早起写个题解还要被审核这么久。我容易吗。。</span>
A. Drazil and Date
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Someday, Drazil wanted to go on date with Varda. Drazil and Varda live on Cartesian plane. Drazil's home is located in point (0, 0) and Varda's home is located in point (a, b). In each step, he can move in a unit distance in horizontal or vertical direction. In other words, from position (x, y) he can go to positions (x + 1, y)(x - 1, y)(x, y + 1) or (x, y - 1).

Unfortunately, Drazil doesn't have sense of direction. So he randomly chooses the direction he will go to in each step. He may accidentally return back to his house during his travel. Drazil may even not notice that he has arrived to (a, b) and continue travelling.

Luckily, Drazil arrived to the position (a, b) successfully. Drazil said to Varda: "It took me exactly s steps to travel from my house to yours". But Varda is confused about his words, she is not sure that it is possible to get from (0, 0) to (a, b) in exactly s steps. Can you find out if it is possible for Varda?

Input

You are given three integers ab, and s ( - 109 ≤ a, b ≤ 1091 ≤ s ≤ 2·109) in a single line.

Output

If you think Drazil made a mistake and it is impossible to take exactly s steps and get from his home to Varda's home, print "No" (without quotes).

Otherwise, print "Yes".

Sample test(s)
input
5 5 11
output
No
input
10 15 25
output
Yes
input
0 5 1
output
No
input
0 0 2
output
Yes
Note

In fourth sample case one possible route is: .

题意:目标点为 ( 0 , 0 ),而你的出发点为 (a, b) ,问 s 步能否到达目标点(0,0) ,能则输出'Yes' ,不能 则输出'No'

题解:水题。只要 a+b 和 s 的奇偶性相同,并且 s >= a + b,就能到达。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#define PI acos(-1.0)
const int  inf =  (1<<30) - 10;
using namespace std;

int main()
{
    int x, y, s;
    cin>>x>>y>>s;
    if(x<0)
        x = -x;
    if(y<0)
        y = -y;
    int sum = x + y;
    s = s - sum;
    if(s%2 == 0 && s >= 0)
    {
        cout<<"Yes"<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }

    return 0;
}

B. Drazil and His Happy Friends
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Drazil has many friends. Some of them are happy and some of them are unhappy. Drazil wants to make all his friends become happy. So he invented the following plan.

There are n boys and m girls among his friends. Let's number them from 0 to n - 1 and 0 to m - 1 separately. In i-th day, Drazil invites -th boy and -th girl to have dinner together (as Drazil is programmer, i starts from 0). If one of those two people is happy, the other one will also become happy. Otherwise, those two people remain in their states. Once a person becomes happy (or if he/she was happy originally), he stays happy forever.

Drazil wants to know whether he can use this plan to make all his friends become happy at some moment.

Input

The first line contains two integer n and m (1 ≤ n, m ≤ 100).

The second line contains integer b (0 ≤ b ≤ n), denoting the number of happy boys among friends of Drazil, and then follow b distinct integers x1, x2, ..., xb (0 ≤ xi < n), denoting the list of indices of happy boys.

The third line conatins integer g (0 ≤ g ≤ m), denoting the number of happy girls among friends of Drazil, and then follow g distinct integersy1, y2, ... , yg (0 ≤ yj < m), denoting the list of indices of happy girls.

It is guaranteed that there is at least one person that is unhappy among his friends.

Output

If Drazil can make all his friends become happy by this plan, print "Yes". Otherwise, print "No".

Sample test(s)
input
2 3
0
1 0
output
Yes
input
2 4
1 0
1 2
output
No
input
2 3
1 0
1 1
output
Yes
Note

By  we define the remainder of integer division of i by k.

In first sample case:

  • On the 0-th day, Drazil invites 0-th boy and 0-th girl. Because 0-th girl is happy at the beginning, 0-th boy become happy at this day.
  • On the 1-st day, Drazil invites 1-st boy and 1-st girl. They are both unhappy, so nothing changes at this day.
  • On the 2-nd day, Drazil invites 0-th boy and 2-nd girl. Because 0-th boy is already happy he makes 2-nd girl become happy at this day.
  • On the 3-rd day, Drazil invites 1-st boy and 0-th girl. 0-th girl is happy, so she makes 1-st boy happy.
  • On the 4-th day, Drazil invites 0-th boy and 1-st girl. 0-th boy is happy, so he makes the 1-st girl happy. So, all friends become happy at this moment.
题意:有 n 个男孩(编号从0开始), m 个女孩;从 第 i  (i从0开始) 天开始, 每次让第 i%n 个男孩去约 第 i%m 个女孩。并且只要其中一个人是“happy” , 则另一个人也会“happy” 。问:不限制 i 的上限,到最后是否可以让所有人都 “happy”。

题解:水题。暴力模拟即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#define PI acos(-1.0)
const int  inf =  (1<<30) - 10;
using namespace std;

int gcd (int a, int b)
{
	return b == 0 ? a : gcd (b, a % b);
}

bool vis1[110];
bool vis2[110];

int main()
{
    int n, m;
    cin>>n>>m;
    for(int i = 0;i <= n; ++i)
        vis1[i] = false;
    for(int i = 0;i <= m; ++i)
        vis2[i] = false;
    int b, g, x;
    cin>>b;
    for(int i = 0;i < b; ++i)
    {
        scanf("%d",&x);
        vis1[x] = true;
    }
    cin>>g;
    for(int i = 0;i < g; ++i)
    {
        scanf("%d",&x);
        vis2[x] = true;
    }
    int temp = 0;
    int t = gcd(n,m);
    t = (n*m)/t; //直接令 t 等于 10000也是可以过的。此题数据较水
    while(temp < t + 100)
    {
        int kn = temp%n;
        int km = temp%m;
        if(vis1[kn] || vis2[km])
        {
            vis1[kn] = vis2[km] = true;
        }
        temp++;
    }
    int judge = 0;
    for(int i = 0;i < n; ++i)
        if(!vis1[i])
            judge++;
    for(int i = 0;i < m; ++i)
        if(!vis2[i])
            judge++;
    if(judge)
    {
        cout<<"No"<<endl;
        return 0;
    }
    cout<<"Yes"<<endl;
    return 0;
}

C. Drazil and Factorial
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Drazil is playing a math game with Varda.

Let's define  for positive integer x as a product of factorials of its digits. For example, .

First, they choose a decimal number a consisting of n digits that contains at least one digit larger than 1. This number may possibly start with leading zeroes. Then they should find maximum positive number x satisfying following two conditions:

1. x doesn't contain neither digit 0 nor digit 1.

2.  = .

Help friends find such number.

Input

The first line contains an integer n (1 ≤ n ≤ 15) — the number of digits in a.

The second line contains n digits of a. There is at least one digit in a that is larger than 1. Number a may possibly contain leading zeroes.

Output

Output a maximum possible integer satisfying the conditions above. There should be no zeroes and ones in this number decimal representation.

Sample test(s)
input
4
1234
output
33222
input
3
555
output
555
Note

In the first case, 

题意:定义. ,问你,找出一个F(a) =  F(x) ,为了更好的解释,假设这个x 等于 1234. 则F(x) =  288; 我们可以找到一个最大的满足条件的数 a = 33222。因为F(a) = 288;

题解:水题。分解一下数字就可以了。

//1! = 0! = 1

//2! = 2!

//3! = 3!

//4! = 3! * 2! * 2!

//5! = 5!

//6! = 5! * 3!

//7! = 7!

//8! = 7! * 2! * 2! * 2!

//9! = 7! * 3! * 3! * 2!

用一个数组记录一下可能出现的所有数字的个数,然后逆着输出便可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#define PI acos(-1.0)
const int  inf =  (1<<30) - 10;
using namespace std;

int vis[11];

int main()
{
    int n;
    char str[100];
    for(int i = 0;i < 11; ++i)
        vis[i] = 0;
    cin>>n;
    scanf("%s",str);
    for(int i = 0;i < n; ++i)
    {
        if(str[i] == '2')
        {
            vis[2]++;
        }
        else if(str[i] == '3')
        {
            vis[3]++;
        }
        else if(str[i] == '4')
        {
            vis[3]++;
            vis[2] = vis[2] + 2;
        }
        else if(str[i] == '5')
        {
            vis[5]++;
        }
        else if(str[i] == '6')
        {
            vis[5]++;
            vis[3]++;
        }
        else if(str[i] == '7')
        {
            vis[7]++;
        }
        else if(str[i] == '8')
        {
            vis[7]++;
            vis[2] = vis[2] + 3;
        }
        else if(str[i] == '9')
        {
            vis[7]++;
            vis[3] = vis[3] + 2;
            vis[2]++;
        }
    }
    for(int i = 10;i >= 0; --i)
    {
        if(vis[i])
        {
            while(vis[i])
            {
                cout<<i;
                vis[i]--;
            }
        }
    }
    cout<<endl;
    return 0;
}

D. Drazil and Tiles
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Drazil created a following problem about putting 1 × 2 tiles into an n × m grid:

"There is a grid with some cells that are empty and some cells that are occupied. You should use 1 × 2 tiles to cover all empty cells and no two tiles should cover each other. And you should print a solution about how to do it."

But Drazil doesn't like to write special checking program for this task. His friend, Varda advised him: "how about asking contestant only to print the solution when it exists and it is unique? Otherwise contestant may print 'Not unique' ".

Drazil found that the constraints for this task may be much larger than for the original task!

Can you solve this new problem?

Note that you should print 'Not unique' either when there exists no solution or when there exists several different solutions for the original task.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 2000).

The following n lines describe the grid rows. Character '.' denotes an empty cell, and the character '*' denotes a cell that is occupied.

Output

If there is no solution or the solution is not unique, you should print the string "Not unique".

Otherwise you should print how to cover all empty cells with 1 × 2 tiles. Use characters "<>" to denote horizontal tiles and characters "^v" to denote vertical tiles. Refer to the sample test for the output format example.

Sample test(s)
input
3 3
...
.*.
...
output
Not unique
input
4 4
..**
*...
*.**
....
output
<>**
*^<>
*v**
<><>
input
2 4
*..*
....
output
*<>*
<><>
input
1 1
.
output
Not unique
input
1 1
*
output
*
Note

In the first case, there are indeed two solutions:

<>^
^*v
v<>

and

^<>
v*^
<>v

so the answer is "Not unique".


题意:有一种1 x 2 的瓷砖,横放或者竖放的铺在一个 N x M 的图中,注:只有“.”才能铺,砖与砖之间不能交错。问:是否有唯一的一种铺砖方法铺满这个N x M 的图。有则输出用这种方法铺砖后的图,否则输出“Not unique

题解:贪心 + dfs 。如果有唯一的铺砖方法,则所有的“.”必定有唯一的横放或者竖放的瓷砖铺在上面,对这个 N x M 的图进行 DFS 每次对有且仅有一种铺砖方法的点进行处理。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#define PI acos(-1.0)
const int  inf =  (1<<30) - 10;
using namespace std;

const int maxx = 2000 + 10;
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int vis[maxx][maxx];
char str[maxx];
int n, m;
int cnt;

void dfs(int x,int y)
{
    if(x < 1 || x > n || y < 1|| y > m || vis[x][y])
        return ;


    int dx = -1;
    int dy = -1;
    int kjudge = 0;
    for(int dd = 0; dd < 4; ++dd)
    {
        int hx = x + dir[dd][0];
        int hy = y + dir[dd][1];
        if(vis[hx][hy]==0)
        {
            if(kjudge)
            {
                kjudge = 0;
                break;
            }
            else kjudge = dd + 1;

            dx = dir[dd][0];
            dy = dir[dd][1];
        }
    }
    if(kjudge)
    {
        if(kjudge == 2)
        {
            vis[x][y] = 3;
            vis[x + dx][y + dy] = 2;
        }
        else if(kjudge == 1)
        {
            vis[x][y] = 2;
            vis[x + dx][y + dy] = 3;
        }
        else if(kjudge == 3)
        {
            vis[x][y] = 5;
            vis[x + dx][y + dy] = 4;
        }
        else if(kjudge == 4)
        {
            vis[x][y] = 4;
            vis[x + dx][y + dy] = 5;
        }
        cnt += 2;
        for(int i = 0; i < 4; ++i)
            dfs(x + dir[kjudge - 1][0] + dir[i][0],y + dir[kjudge - 1][1] + dir[i][1] );
    }
}

int main()
{
    cin>>n>>m;
    for(int i = 0; i <= n + 1; ++i)
    {
        for(int j = 0; j <= m + 1; ++j)
        {
            vis[i][j] = 1;
        }
    }
    cnt = 0;
    for(int i = 1; i <= n; ++i)
    {
        scanf("%s",str);
        for(int j = 0; j < m; ++j)
        {
            if(str[j] == '.')
            {
                vis[i][j + 1] = 0;
            }
            else
            {
                cnt++;
            }
        }
    }
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            dfs(i,j);
        }
    }
    if(cnt != n * m)
    {
        cout<<"Not unique"<<endl;
    }
    else
    {
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <= m; ++j)
            {
                if(vis[i][j] == 1)
                {
                    cout<<"*";
                }
                else if(vis[i][j] == 2)
                {
                    cout<<"^";
                }
                else if(vis[i][j] == 3)
                {
                    cout<<"v";
                }
                else if(vis[i][j] == 4)
                {
                    cout<<">";
                }
                else if(vis[i][j] == 5)
                {
                    cout<<"<";
                }
            }
            cout<<endl;
        }
    }
    return 0;
}

本来D题有着充足的时间,但是看完题目后感觉没有思路,就跑去HACK别人的B题。

后来想挣扎一下,就继续回去看D。结果、、


比赛结束前20分钟的时候想到了思路。愣是在比赛结束后4分钟左右才写出来。

难道这就是对我这种题目都还没写完,就跑去HACK别人的人的惩罚吗。。。。。

上次看到别人的代码中的一行注释:妈妈说HACK别人的孩子不是好孩子,会遭报应的。= =

这次果断遭报应了。。。


如有BUG,欢迎指出!

源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...
源码下载地址: https://pan.quark.cn/s/926926948560 AS3.0与XML结合的通用图片滚动功能,是一种基于ActionScript 3.0和XML技术的动态图像展示方案,非常适合初学者进行学习和实践应用。此项目的关键在于借助XML文件作为数据媒介,用来保存图像的相关参数,例如图像的链接地址、展示的次序等,接着在AS3.0环境中对XML进行解析,并动态地载入和展示这些图像,达成图像的滚动或是循环播放的目的。 我们需要明确ActionScript 3.0(AS3.0)是Adobe Flash Professional以及Flex Builder等开发工具中采用的编程语言,用于构建交互式内容以及丰富的互联网应用。相较于先前的版本,AS3.0在性能上有了大幅度的提升,并且引入了更为规范的面向对象编程模式,涵盖了类、接口以及包等概念。 XML(可扩展标记语言)是一种简明且高效的数据传输格式,既便于人类阅读和编写,也易于机器进行解析和生成。在该项目中,XML文件用于存储图像数据,例如图像的URL、延时的时长、动画的样式等,通过这种方式可以将数据与程序代码分离,从而增强代码的可维护性与可扩展程度。 实施这一图片滚动功能,主要涉及到以下AS3.0的核心知识点: 1. **XML解析**:运用`XML`类来载入并解析XML文件,从而获取图像的清单。AS3.0提供了简便的API来操作XML节点,例如`children()`、`attributes()`等,用以获取子节点和属性值。 2. **事件监听**:借助`EventDispatcher`类来监控载入和解析过程中的事件,比如`Event.OPEN`、`Event.PROGRESS`、`Event...
内容概要:本文介绍了软件许可管理的技术实现方式及相关工具资源,重点阐述了加密外壳(EMS)和API加密两种保护机制。加密外壳通过将程序(如.exe、.dll、.apk)封装在加密壳中,实现运行时内存解密,防止静态反编译和代码篡改,同时支持对数据文件、系统参数及部分代码的加密,并依赖硬件锁(HL)或软件锁(SL)进行授权控制。API加密则通过在代码中嵌入安全验证调用,确保授权合法后才执行核心逻辑。文章还说明了锁的类型(HL/SL)、模式(有驱/AdminMode与无驱/UserMode)、升级路径以及虚拟时钟功能,并描述了产品授权流程从功能定义到产品创建、授权生成的全过程,支持通过C2V文件或锁ID复制已有授权状态。文中附带多个开源平台链接和技术博客参考资源。; 适合人群:从事软件版权保护、授权系统开发或安全技术研究的研发人员,尤其是具备一定逆向工程、软件安全基础的1-3年经验开发者。; 使用场景及目标:①构建安全的软件授权体系,防止盗版和非法使用;②实现灵活的功能授权管理(如时效、并发、硬件绑定);③选择合适的加密方案(硬件锁/软锁、有驱/无驱)并集成到现有产品中;④学习加密外壳与API验证的实际应用方法; 阅读建议:此资源侧重于软件许可的技术架构与实施细节,建议结合提供的GitHub、Gitee项目链接及CSDN技术文章深入理解实现原理,并通过实际调试加密壳和模拟授权流程加强实践能力。
内容概要:本文聚焦于“风光制氢合成氨系统优化研究”,系统阐述了基于Cplex求解器对该耦合系统进行数学建模与优化求解的全过程,并提供了完整的Matlab代码实现。研究整合风能、光伏等可再生能源发电与电解水制氢、合成氨化工工艺,构建涵盖系统容量配置与运行调度的联合优化模型,旨在提升绿电就地消纳水平、降低碳排放强度并实现综合能源利用效率的最大化。文中详细解析了优化模型的核心构成,包括以综合成本最小化或能源效率最大化为目标的目标函数设计,以及涵盖设备出力能力、系统能量动态平衡、设备启停特性等关键环节的约束条件建模方法,利用Cplex求解器进行高效精确求解,模型适用于并网与离网等多种运行场景。; 适合人群:具备一定能源系统建模与优化理论基础,熟练掌握Matlab编程语言及常用优化工具箱(如YALMIP)应用的科研人员与工程技术从业者,特别适用于从事综合能源系统规划、绿色氢能与绿氨生产、可再生能源高效集成等前沿领域的硕士、博士研究生及高校科研人员。; 使用场景及目标:①复现高水平学术论文中关于风光制氢合成氨系统的复杂优化模型;②深入掌握Cplex求解器在大规模、多约束能源系统优化问题中的高级建模与调用技巧;③开展面向“双碳”战略的绿氢、绿氨生产项目的可行性分析、规划设计与运行策略研究,为清洁能源项目的科学决策与工程落地提供量化依据和技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码与相关领域的权威文献进行对照学习,重点剖析模型构建的物理逻辑与数学推导过程,熟练掌握Cplex与Matlab的接口调用方法;鼓励读者通过调整系统参数、修改目标函数或扩展模型结构(如引入更多不确定性因素)等方式进行二次开发,以适应不同的实际应用场景,进一步深化对综合能源系统优化的理解与实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值