# CodeCraft-20 (Div. 2)
CodeCraft-20 (Div. 2)
A. Grade Allocation
- 思路 : 无脑水题
- 代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int Len = 1e3 + 5;
int ar[Len];
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//freopen("A.txt","r",stdin);
int t;
cin >> t;
while(t --)
{
int n,m;
cin >> n >> m;
int sum = 0;
for(int i = 1; i <= n; i ++)
{
cin >> ar[i];
sum += ar[i];
}
cout << min(m, sum) <<endl ;
}
return 0;
}
B. String Modification
题意: 对一个 字符传, 选取一个长度k,然后从左到右开始,依次从 第一位置开始的长度为k的连续字符串,进行颠倒,颠倒之后获得一个新的字符串,接着从从这个字符串的第二个位置开始选取接下来的k个字符的长度,进行颠倒,,,,这样一直颠倒到最后,会产生出一个 最终的字符串。问当我们选取的 k 为多少事可以 让 的出来的 “最终的字符串” 按字典序 最小,,如果有多个k能得到最小,那么 输出最小的k就行了
思路 :其实这一题答案给的方法挺暴力的,首先在做这一题的时候,我们要找出来一些 在字符串 翻滚前后的规律, 举个例子大概说一下吧:设有字符串
e r t y q w
,我们假设要翻滚的长度 k 为3 ,那么翻滚完折之后的结果字符串为
t y q w e r
, 可以观察到 在原字符串 中 [ k , 6] 部分的字符串原封不动的到了最终字符串的前边,而[1, k - 1] 的字符串到了最终字符串的后边( 【1, k - 1】的字符串没有 颠倒),自己在多写几个例子模拟一下,会有规律:设原始字符串长度为n , 则【k, n】的部分成为最终字符串的前缀(前半部分),而 【1,k - 1】的部分,在 k、n 同奇偶的时候 颠倒到过顺序 作为最终字符串的 后缀(后半部分),如果不满足 k、n同奇偶,则则直接作为 最终的字符串的后半部分,
剩下的就是 根据规律暴力枚举每一个(枚举的时候 可以通 strig 类来偷懒) k ,去找最优解代码
#include <bits/stdc++.h>
using namespace std;
string modified(string& s, int n, int k) {
string result_prefix = s.substr(k - 1, n - k + 1);
string result_suffix = s.substr(0, k - 1);
if (n % 2 == k % 2)
reverse(result_suffix.begin(), result_suffix.end());
return result_prefix + result_suffix;
}
int main () {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
string s, best_s, temp;
int t, n, best_k;
cin >> t;
while (t--) {
cin >> n >> s;
best_s = modified(s, n, 1);
best_k = 1;
for (int k = 2; k <= n; ++k) {
temp = modified(s, n, k);
if (temp < best_s) {
best_s = temp;
best_k = k;
}
}
cout << best_s << '\n' << best_k << '\n';
}
return 0;
}
C. Primitive Primes(数学规律)
题意 给两个
本原多项式
:形如:f(x)= a0 + a1 * x^1 + a2 * x^1 + … + an * x^n , 那么这个连个 本原多项式相乘以有 又产生一个 本原多项式h(x),在这个多项式中随便找出一个 系数 满足 让该系数不能被所制定的数p 整除。思路: 分别找出在前两个多项式中,第一个不能被 p整除的系数,这这两个系数的位置相加,就是最终的 h(x) 的一个位置
证明: 我们可以得到:答案一项的表示是为:
(a0∗bi+j+a1∗bi+j−1+…)+ai∗bj+(ai+1∗bj−1+ai+2∗bj−2+…),
其中 由于ai,bi分别是第一个不能被整除的,那么我们就可以断定,在 ari、bi系数之前的 系数 a0,a1…ai-1 、 b0,b1 … bj-1, 均是可以被整除的,所以在上柿子中,左右两个括号的内的 都可以被整除, 而只有中间项 ai*bj 是不能被整除的,两可以被整除的数 + 一个不能被整除的数 == 一个不能被整除的数代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ll n,i,m,x,a,p,fir,sec;
cin >> n >> m >> p;
a=0;
for(i=0;i<n;i++)
{
cin >> x;
if(x%p && !a)
{
a=1;
fir=i;
}
}
a=0;
for(i=0;i<m;i++)
{
cin >> x;
if(x%p && !a)
{
a=1;
sec=i;
}
}
cout << fir+sec << endl;
return 0;
}
D. Nash Matrix (dfs/bfs + 分析)
题意:给我一个 nxn的表格,让我们在表格上填 U 、D、 L、 R、 X (终点)五个字符来完成这个表格,然后有给了每个表格中位置的终点(有的点是可能是无限循环,没有终点用 -1 -1 来表示),问怎么填写这个字符才可以,符合 上述要求
思路 : 这一题我们可以把 格子坐标分为两大类,第一类是格点坐标是组成无线循环路径的点;而第二列为不是组成无线循环路径中的点(这些点是有确定的终点的)
注意重点的是 这两类格点的关系是互相不干扰的,也就是说如果是第二类格点,那么他一定不会出现在 循环路径中,同样如果是在 循环路径中的点 一定不会走到
非循环的路径中去(因为一旦 走到非循环路径中去的话,那个 这个在循环路径中的格点,就有了“终点”, 而这与题意是不符合的), 所以我从这里得出的结论就是
这两类格点我们可以分开去处理,例如:我们可以先用 bfs/dfs 根据“终点”逆向求解 第二类格点中应该填写的符号,然后在单独考虑第一类节点就行了;
当然也可以把这两类 一起考虑,分开讨论
*/
- 代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
const int maxn = 1e3 + 5;
int n;
int x[maxn][maxn], y[maxn][maxn];
char maze[maxn][maxn];
int connect(int i, int j, int r, int s, char c1, char c2)
{
if(x[r][s] == -1)
{
maze[i][j] = c1;
if(maze[r][s] == '\0') maze[r][s] = c2;
return 1;
}
return 0;
}
void dfs(int i, int j, char c)
{
if(maze[i][j] != '\0') return; //如果不是非空字符,说明这个节点周围的点都已经被搜索过了
maze[i][j] = c;
//⬇️ 下面的过程都是从逆向推倒 正向路径的过程 (符合逆向推答案的条件是 这个格点与周围的那个格点拥有相同的 “终点”, 这里一定要千万注意啊~~~~~)
if(x[i + 1][j] == x[i][j] && y[i + 1][j] == y[i][j]) dfs(i + 1, j, 'U');
if(x[i - 1][j] == x[i][j] && y[i - 1][j] == y[i][j]) dfs(i - 1, j, 'D');
if(x[i][j + 1] == x[i][j] && y[i][j + 1] == y[i][j]) dfs(i, j + 1, 'L');
if(x[i][j - 1] == x[i][j] && y[i][j - 1] == y[i][j]) dfs(i, j - 1, 'R');
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//freopen("A.txt","r",stdin);
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
cin >> x[i][j] >> y[i][j];
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
if(x[i][j] == -1) //如果在该格点是第一类格点
{
bool res = (maze[i][j] != '\0');
//如果res == 0 判读这个点与周围其它的点是否联通, 尝试让它们联通!!!
if(! res) res = connect(i, j, i + 1, j, 'D', 'U');
if(! res) res = connect(i, j, i, j + 1, 'R', 'L');
if(! res) res = connect(i, j, i - 1, j, 'U', 'D');
if(! res) res = connect(i, j, i, j - 1, 'L', 'R');
if(! res)
{
cout << "INVALID\n";
return 0;
}
}
else if(x[i][j] == i && y[i][j] == j) //如果是第二类节点并且是第二类节点的“终点”
dfs(i, j, 'X');
}
//当图中有些点没有 被填上符号的时候,就说明给的条件有问题。。。
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
if(maze[i][j] == '\0')
{
cout << "INVALID\n";
return 0;
}
}
cout << "VALID\n";
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= n; j ++)
cout << maze[i][j];
cout << endl;
}
return 0;
}
# CodeCraft-20 (Div. 2)的更多相关文章
- 喵哈哈村的魔法考试 Round #20 (Div.2) 题解
题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...
- 如何让图片在垂直方向与 div的底部对齐 水平居中
需要图片的绝对定位postion: absolute. 一般定位时, 是用div去定位. 一般不直接用 非div去"绝对/相对"定位. 如不直接用 等去定位. 因为这些好像不好定位 ...
- DIV与SPAN的区别
DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元素(也译作内嵌元素). 详解:1 ...
- DIV与SPAN之间有什么区别
DIV与SPAN之间有什么区别 DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元 ...
- 拖动DIV
链接:https://www.cnblogs.com/joyco773/p/6519668.html 移动端:div在手机页面上随意拖动 1 <!doctype html> 2 & ...
- (网页)20个JS 小技巧超级实用
转自CSDN: 1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false”< table border oncontextmenu=r ...
- div和span元素的区别
2个都是用来划分区间但是没有实际语义的标签,差别就在于div是块级元素,不会其他元素在同一行;span是内联元素,可以与其他元素位于同一行. DIV 和 SPAN 元素最大的特点是默认都没有对元素内的 ...
- Effective STL 学习笔记:19 ~ 20
Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- jquery动态创建元素 div元素随垂直滚动条位置变化置顶显示
刚打开页面效果 拖动滑动条之后效果 页面代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...
- 20个JS 小技巧超级实用
1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false” < table border oncontextmenu=return(f ...
随机推荐
- python入门到放弃-基本数据类型之tuple元组
#概述 元组俗称不可变的列表,又称只读列表,是python的基本数据类型之一, 用()小括号表示,里面使用,逗号隔开 元组里面可以放任何的数据类型的数据,查询可以,循环可以,但是就是不能修改 #先来看 ...
- SpringBoot1.5.10.RELEASE项目如何在tomcat容器中运行
一. SpringBoot内嵌容器的部署方式 SpringBoot内部默认提供内嵌的tomcat容器,所以可以直接打成jar包,丢到服务器上的任何一个目录,然后在当前目录下执行java -jar de ...
- Promise,Generator,Await/Async
上节中忘记讲:Iterator接口和Generator函数的关系了,Symbol.iterator方法的最简单的实现就是通过Generator函数: let myIterable = { [Symbo ...
- 聊聊CAS - 面试官最喜欢问的并发编程专题
什么是CAS 学习Java并发编程,CAS(Compare And Set)机制都是一个不得不掌握的知识点.除了通过synchronized进行并发控制外,还可以通过CAS的方式控制,大家熟悉的Ree ...
- 纯C 实现 strpos substr strspilt str_trim
在C 语言中没有C++ 好用的 spilt 方法 (STL 带的也不怎么好用) #include <stdio.h> #include <string.h> #include ...
- Logback,SLF4J,Log4J2。了解它们并学习如何使用。(翻译)
背景 如果您正在或在任何Java项目上工作,则可能已记录了一些debug,error或info语句以进行调试或跟踪.通过将库记录到磁盘或其他某种介质上的文件中来写这些语句. 日志记录是任何项目的关键方 ...
- burpsuit之Spider、Scanner、Intruder模块
1.spider模块 1.spider模块介绍 被动爬网:(被动爬网获得的链接是手动爬网的时候返回页面的信息中分析发现超链接) 对于爬网的时候遇到HTML表单如何操作: 需要表单身份认证时如何操作(默 ...
- Go 武林外传 - 初出茅庐
没有旁白. 我叫小白, 白痴的白. 老头说我太笨了, 提前放我下山, 让我自生自灭. 对了, 忘了说了, 那老头是我师傅. 虽然我的内心深处是拒绝的, 但是我又打不过老头, 只好收拾铺盖滚犊子了. 算 ...
- Win2012+Nginx+IIS+xxfpm(服务版)
这次做了一个项目部署在环境为win2012+nginx1.13.5+mysql5.6+php7的环境下,服务器是阿里云的 由于之前没有这种经验,遇到了点坑(据参考文章里说的这坑还有些年份了),最开始自 ...
- 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式
表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...