Technocup 2019 - Elimination Round 2
http://codeforces.com/contest/1031
(如果感觉一道题对于自己是有难度的,不要后退,懂0%的时候敲一遍,边敲边想,懂30%的时候敲一遍,边敲边想,懂60%的时候敲一遍,边敲边想,(真实情况是你其实根本不用敲那么多遍……),然后,这道题你就差不多可以拿下了ψ(`∇´)ψ)
(IO模板在最后的蛋里)
A. Golden Plate
n*m矩形,最外圈为第一圈,间隔着选k个圈,问总共占多少给格子
每圈贡献=2n‘+2m'-4,圈圈长宽以-4递减下去
public static void main(String[] args) {
IO io=new IO();
int n=io.nextInt(),m=io.nextInt(),k=io.nextInt();
long ans=0;
while (k-->0){
ans+=2*n+2*m-4;
n-=4;m-=4;
}
io.println(ans);
}
B. Curiosity Has No Limits
给你长度为n-1的两个数列,问是否存在长度为n的数列t,满足ai=ti|ti+1&&bi=ti&ti+1,三个数列的元素都属于[0,3]
元素太少了,一开始想直接打表,但i、j到底哪个先哪个后不知道,所以从找规律入手
System.out.println(i+" "+j+" "+(i|j)+" "+(i&j));
//对应ti、ti+1、ai、bi
0 0 0 0
0 1 1 0
0 2 2 0
0 3 3 0
1 0 1 0
1 1 1 1
1 2 3 0
1 3 3 1
2 0 2 0
2 1 3 0
2 2 2 2
2 3 3 2
3 0 3 0
3 1 3 1
3 2 3 2
3 3 3 3
发现ti + ti+1==ai + bi,可以枚举t[0],看是否得到合法的数列t
public static void main(String[] args) {
IO io = new IO();
int n = io.nextInt();
int[] a = new int[n];
int[] b = new int[n];
int[] t = new int[n];
for (int i = 0; i < n - 1; i++) a[i] = io.nextInt();
for (int i = 0; i < n - 1; i++) b[i] = io.nextInt();
OUT:
for (int i = 0; i < 4; i++) {
t[0] = i;
for (int j = 1; j < n; j++) {
t[j] = a[j - 1] + b[j - 1] - t[j - 1];
if ((t[j] | t[j - 1]) != a[j - 1] ||
(t[j] & t[j - 1]) != b[j - 1]) continue OUT;
}
io.println("Yes");
for (int j = 0; j < n; j++) io.print(t[j] + " ");
return;
}
io.println("No");
}
C. Cram Time
给你两个数a、b,输出元素总个数最多的且累加和分别不超过a、b的两组数,其中每个数只能用一次
关键点在于当n是1+2+……+n<=a+b的最大的n时,1到n的所有数都一定选得上,只要对其中一个数从大到小取就可以保证
public static void main(String[] args) {
IO io = new IO();
int a = io.nextInt(), b = io.nextInt(), cnt = 0, n = 0;
long l = 1, r = a + b, mid;
while (l <= r) {
mid = (l + r) / 2;
if (a + b < (mid + 1) * mid / 2) {
r = mid - 1;
} else {
l = mid + 1;
n = (int) mid;
}
}
int[] vis = new int[n + 1];
for (int i = n; i >= 1; i--)
if (a >= i) {
a -= i;
cnt++;
vis[i] = 1;
}
io.println(cnt);
for (int i = 1; i <= n; i++) if (vis[i] == 1) io.print(i + " ");
io.println("\n" + (n - cnt));
for (int i = 1; i <= n; i++) if (vis[i] == 0) io.print(i + " ");
io.close();
}
D. Minimum path
有一个由小写字母填满的n*n矩阵,你可以改变不超过k个字母,使从(1,1)到(n,n)的字典序最小,你只能往右走或往下走
k全部用来把前面非‘a'字符换成’a'。搜索从用完k后获得长度最长‘a'串开始。ans[i]表示答案的第i个字符,对于每个ans[i],搜索所有i可能的位置,取其最小值。因为对于每个特定的长度i,其末位置不会和长度i-1的末位置重叠(如下图),所以长度i得到的末尾点j,i-j+1,vis[j][i-j+1]表示为长度为i时该点是否可达。
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
public static void main(String[] args) {
IO io = new IO();
int n = io.nextInt(), k = io.nextInt(); int[][] a = new int[c][c];
int[][] dp = new int[c][c];
int[][] vis = new int[c][c];
int[] ans = new int[c * 2]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) a[i][j] = io.nextChar();
int len = 0;
//【初始化一定不要偷懒】
vis[1][1] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
//【这里也是一样,不要贪图代码短】
if (i == 1 && j == 1) dp[1][1] = 0;
else if (i == 1) dp[1][j] = dp[1][j - 1];
else if (j == 1) dp[i][1] = dp[i - 1][1];
else dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]);
if (a[i][j] != 'a') dp[i][j]++;
if (dp[i][j] <= k) {
vis[i + 1][j] = vis[i][j + 1] = 1;
len = Math.max(i + j - 1, len);
}
}
Arrays.fill(ans, 'z');
Arrays.fill(ans, 1, len + 1, 'a');
for (int i = len + 1; i <= 2 * n - 1; i++) {
for (int j = 1; j <= n; j++)
if (1 <= i - j + 1 && i - j + 1 <= n && vis[j][i - j + 1] == 1)
ans[i] = Math.min(ans[i], a[j][i - j + 1]);
//因为最小点可能不止一个,所以不能只记录一个点
for (int j = 1; j <= n; j++)
if (1 <= i - j + 1 && i - j + 1 <= n && vis[j][i - j + 1] == 1
&& a[j][i - j + 1] == ans[i])
vis[j + 1][i - j + 1] = vis[j][i - j + 2] = 1;
}
for (int i = 1; i <= 2 * n - 1; i++) io.print((char) ans[i]);
}
E. Triple Flips
给你长度为n的01串,你可以对其进行不超过n/3+12次操作将其变成全0串,该操作为选三个间隔相等的数将其翻转(0->1,1->0),如果存在解,请打印出所有操作数字的下标
关键思想是每次保证最左边或最右边的三个数为0,字符串过小时枚举每一种情况。
private static final int c = (int) (1e5 + 10);
static IO io = new IO();
static int n;
static int[] a = new int[c];
//一边操作一边记录
static ArrayList<int[]> ans = new ArrayList<>(); static void solve0(int l, int r) {
ArrayList<int[]> p = new ArrayList<>();
int[] t = new int[c];
int a1, a2; for (int i = l; i <= r; i++) for (int j = i + 2; j <= r; j += 2) p.add(new int[]{i, j});
OUT:
for (int i = 0; i < 1 << p.size(); i++) {
System.arraycopy(a, l, t, l, r - l + 1);
for (int j = 0; j < p.size(); j++)
if ((i >> j & 1) == 1) {
a1 = p.get(j)[0];
a2 = p.get(j)[1];
t[a1] ^= 1;
t[a2] ^= 1;
t[a1 + a2 >> 1] ^= 1;
}
for (int j = l; j <= r; j++) if (t[j] == 1) continue OUT;
for (int j = 0; j < p.size(); j++)
if ((i >> j & 1) == 1) ans.add(p.get(j)); io.println("YES");
io.println(ans.size());
for (int[] v : ans) io.println(v[0] + " " + (v[0] + v[1] >> 1) + " " + v[1]);
return;
}
io.println("NO");
} //坚定不移保证左三或右三全为0
static void solve(int l, int r) {
//flip需要长度至少为7
if (r - l + 1 < 7) {
while (l > 1 && r - l + 1 < 8) l--;
while (r < n && r - l + 1 < 8) r++;
solve0(l, r);
return;
}
if (a[l] == 0) {
solve(l + 1, r);
return;
}
if (a[r] == 0) {
solve(l, r - 1);
return;
}
//111……
if (a[l + 1] == 1 && a[l + 2] == 1) {
flip_add(l, l + 2);
solve(l + 3, r);
return;
}
//……111
if (a[r - 1] == 1 && a[r - 2] == 1) {
flip_add(r - 2, r);
solve(l, r - 3);
return;
}
//101……
if (a[l] == 1 && a[l + 2] == 1) {
flip_add(l, l + 4);
solve(l + 3, r);
return;
}
//……101
if (a[r - 2] == 1 && a[r] == 1) {
flip_add(r - 4, r);
solve(l, r - 3);
return;
}
//100……翻转分别为l、l+2、l+4,目标是结果为000
if (a[l + 1] == 0 && a[l + 2] == 0) {
flip_add(l, l + 6);
solve(l + 3, r);
return;
}
//……001
if (a[r - 1] == 0 && a[r - 2] == 0) {
flip_add(r - 6, r);
solve(l, r - 3);
return;
}
//110……和……011
if ((r - l + 1) % 2 == 1) {
flip_add(l, r);
flip_add(l + 1, r - 1);
solve(l + 3, r - 3);
} else {
flip_add(l, r - 1);
flip_add(l + 1, r);
solve(l + 3, r - 3);
}
} public static void main(String[] args) {
n = io.nextInt();
for (int i = 1; i <= n; i++) a[i] = io.nextInt();
solve(1, n);
}
//0变1,1变0
static void flip_add(int l, int r) {
a[l] ^= 1;
a[r] ^= 1;
a[l + r >> 1] ^= 1;
ans.add(new int[]{l, r});
}
F. Familiar Operations
有正整数a、b以及两种操作:1、对其中一个数乘以某个素数,2、对其中一个数除以其素因子,问让两个数因子数相同的最小操作是多少。
public static void main(String[] args) {
int[] prim = new int[c];
int[][][] dp = new int[289][31][1201];
HashSet<ArrayList<Integer>> s = new HashSet<>();
ArrayList<Integer> t = new ArrayList<>();
ArrayList<ArrayList<Integer>> qt = new ArrayList<>();
ArrayList<Integer>[] v = new ArrayList[c];
for (int i = 1; i < c; i++) v[i] = new ArrayList<>(7);
Arrays.fill(prim, 1); for (int i = 2; i < c; i++)
if (prim[i] == 1) for (int j = 1; i * j < c; j++) {
int x = j;
int p = 2;
while (x % i == 0) {
x /= i;
p++;
}
v[i * j].add(p);
prim[i * j] = 0;
}
for (int i = 1; i < c; i++) while (v[i].size() < 7) v[i].add(1);
for (int i = 1; i < c; i++) {
Collections.sort(v[i]);
s.add(v[i]);
}
qt.addAll(s);
for (int i = 0; i < qt.size(); i++)
for (int j = 0; j <= 30; j++) Arrays.fill(dp[i][j], 999);
for (int y = 0; y < qt.size(); y++) {
t.clear();
for (int i = 0; i < 7; i++) t.add(qt.get(y).get(i));
while (t.size() < 30) t.add(1);
dp[y][0][1] = 0;
for (int i = 0; i < 30; i++) {
for (int j = 1; j <= 1200; j++) {
if (dp[y][i][j] < 999) for (int l = 1; j * l <= 1200; l++)
dp[y][i + 1][j * l] = Math.min(dp[y][i + 1][j * l],
dp[y][i][j] + Math.abs(t.get(i) - l));
}
}
} IO io = new IO();
int n = io.nextInt();
while (n-- > 0) {
int p1 = qt.indexOf(v[io.nextInt()]), g1 = qt.indexOf(v[io.nextInt()]);
int ans = 9000;
for (int j = 1; j <= 1200; j++) ans = Math.min(ans, dp[p1][30][j] + dp[g1][30][j]);
io.println(ans);
}
}
彩蛋(/≧▽≦)/丢~快接~
Technocup 2019 - Elimination Round 2的更多相关文章
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)
Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)B. Personalized Cup
题意:把一长串字符串 排成矩形形式 使得行最小 同时每行不能相差大于等于两个字符 每行也不能大于20个字符 思路: 因为使得行最小 直接行从小到大枚举即可 每行不能相差大于等于两个字符相当于 ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) C. Playing Piano
题意:给出一个数列 a1 a2......an 让你构造一个序列(该序列取值(1-5)) 如果a(i+1)>a(i) b(i+1)>b(i) 如果a(i+1)<a(i) 那么b( ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) D. Barcelonian Distance 几何代数(简单)
题意:给出一条直线 ax +by+c=0 给出两个整点 (x1,y1) (x2,y2) 只有在x,y坐标至少有一个整点的时 以及 给出的直线才有路径(也就是格子坐标图的线上) 问 两个整点所需要 ...
- Technocup 2019 - Elimination Round 1
http://codeforces.com/contest/1030 B. Vasya and Cornfield 判断点是否在矩形内(包括边界) 把每条边转化为一个不等式 public static ...
- (AB)Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round
A. Right-Left Cipher time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path
http://codeforces.com/contest/1072/problem/D bfs 走1步的最佳状态 -> 走2步的最佳状态 -> …… #include <bits/ ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path(字典序)
https://codeforces.com/contest/1072/problem/D 题意 给你一个n*n充满小写字母的矩阵,你可以更改任意k个格子的字符,然后输出字典序最小的从[1,1]到[n ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) Solution
A. Kitchen Utensils Water. #include <bits/stdc++.h> using namespace std; #define N 110 int n, ...
随机推荐
- sql语句修改字段类型和增加字段
/*修改字段类型*/ ) go /*增加字段和说明*/ ) EXECUTE sp_addextendedproperty N'MS_Description','说明文字',N'user',N'dbo' ...
- Java 基本文件操作
Java 文件操作 , 这也是基于Java API 操作来实现的. 文件是操作系统管理外存数据管理的基本单位, 几乎所有的操作系统都有文件管理机制. 所谓文件, 是具有符号名而且在逻辑上具有完整意义的 ...
- zabbix监控交换机状态
1.在Zabbix中添加主机 输入名称.群组和交换机IP(交换机要开启snmp) 2.创建监控项 输入OID和其它信息(键值随便填,但是不能和系统内的键值重复)OID获取方法可查看上一篇文章:http ...
- Java基础系列--03_Java中的方法描述
方法 (1)方法的定义:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2 ...
- Pyinstaller 打包exe
安装 pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的 ...
- 微信h5支付
分为 微信内H5调起支付 和 非微信浏览器H5支付. 1.H5支付(微信内) 参考链接:https://www.jianshu.com/p/6b9acdd10de6 2.JSAPI支付(非微信) 参考 ...
- 开发日记:JsonCSharpHelp
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Converters; public static c ...
- .netcore2.0发送邮件
SmtpClient smtpClient = new SmtpClient(); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指 ...
- js作用域零碎的知识点,不同的script块,虽然同是全局变量
如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...
- Mint-ui 脱坑日记
Field表单组件 这个组件真是大坑特坑 带默认背景边框 找了半天才找到 原生属性 :attr="{ maxlength:10 }" 是可以设置原生属性的 注意此处限制的输入长度 ...