2019牛客多校第六场 B - Shorten IPv6 Address 模拟
B - Shorten IPv6 Address
题意
给你\(128\)位的二进制,转换为十六进制。
每\(4\)位十六进制分为\(1\)组,每两组用一个\(“:”\)分开。
每一组的十六进制要去掉前导\(0\)。
如果存在连续两组以上的\(0\)要转换为\(“::”\)。比如,\(0:0:0、0:0\)都可以转换成\("::"\)。
但是最多只能转换一次,要求在长度最短的条件下字典序最小。
思路
- 先把二进制串转换为16进制串
- 找到最长连续的\(0\)的位置转换为\(“::”\),如果长度相等,头和尾优先选尾,头和尾和中间,优先选中间。(长度相同,选中间会比选头或者尾短一个长度)
三种不同的选法(明显中间最短,且最优)
0:0:1:0:0:1:0:0
前:::1:0:0:1:0:0
后:0:0:1:0:0:1::
中:0:0:1::1:0:0
一些数据
1
00000000000000000000000000000000000000000000111100000000000000000000000000000000000000001111111100000000000000000000000000000000
Case #1: 0:0:f::ff:0:0
一些乱七八糟的感想
其实就是一个模拟啦,刚开始暴力选长度最长,相等全部给我往后走,然后就\(WA\)了, 作为一个专业划水选手,我就在旁边看着队友的代码一步步从\(50\)行到\(100\)行,到最后接近\(200\)行,三个人找不到错误,找到上面这个样例之后,发现还是\(WA\),最后还是用暴力找全部,然后找答案。看了题解之后发现好像没有其他的坑。嗯。。。吸取队友的经验,还是尝试写了一下代码,锻炼一下写代码的能力?,嗯。。。好像没有比赛的时候想的那么麻烦。嗯。。还是要努力呀,不能老是拖后腿呀。
AC 代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200;
char ch[maxn];
int a[10][6];
int main(){
int T, Cas = 1;
scanf("%d", &T);
while(T--){
scanf("%s", ch+1);
int cnt = 0;
for(int i = 1; i <= 128;){
cnt++;
for(int k = 1; k <= 4; k++){ //每4个十六进制为1组
a[cnt][k] = 0;
for(int j = 3; j >= 0; j--,i++){ //每4位二进制转换一个十六进制
a[cnt][k] += (ch[i]-'0')*(1<<j);
}
}
}
int l, r, wl, wr; //变成::的位置
l = 1;r = 0;wl = 0, wr = -1;
for(int i = 1; i <= cnt; i++){
int flag = 0;
for(int j = 1; j <= 4; j++){
if(a[i][j] != 0){
flag = 1;
break;
}
}
if(!flag){ //当前为0
r++;
}
if(flag || i == cnt){ //当前不为0或者读到末尾
if(r-l+1 > wr-wl+1 && r-l+1 >= 2){
wl = l;wr = r;
}
else if(r-l+1 == wr-wl+1 && r-l+1 >= 2 && (r != cnt || wl == 1)){
wl = l;wr = r;
}
l = i+1;r = i;
}
}
printf("Case #%d: ", Cas++);
for(int i = 1; i <= cnt; i++){
if(i == wl){
if(i == 1)
printf(":");
printf(":");
if(wr == cnt)
printf("\n");
i = wr;
}
else{
int flag = 0;
for(int j = 1; j <= 4; j++){
char s = a[i][j] >= 10?a[i][j]-10+'a':a[i][j]+'0';
if(!flag && (a[i][j] != 0 || j == 4)){ //去前导0
flag = 1;
}
if(flag)
printf("%c", s);
}
printf("%c", i == cnt?'\n':':');
}
}
}
return 0;
}
2019牛客多校第六场 B - Shorten IPv6 Address 模拟的更多相关文章
- 2019 牛客多校第六场 B Shorten IPv6 Address
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题目大意 给定一个 128 位的二进制 ip 地址,让你以 16 位一组,每组转成 16 进制,用冒号连接 ...
- 牛客多校第六场 B Shorten IPv6 Address 模拟
题意: 给你一个二进制表示的IPv6地址,让你把它转换成8组4位的16进制,用冒号分组的表示法.单组的前导0可以省略,连续多组为0的可以用两个冒号替换,但是只允许替换一次.把这个地址通过这几种省略方式 ...
- [题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题意: 您将获得一个IPv6地址,该地址是128位二进制字符串.请根据以下规则确定其最短的表示: 以十六进 ...
- 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...
- 2019 牛客多校第六场 D Move
题目链接:https://ac.nowcoder.com/acm/contest/886/D 题解摘自官方题解 题目大意 有 K 个体积相同的箱子,有 N 个体积相同或相异的物品,现要按照如下策略装箱 ...
- 2019 牛客多校第六场 J Upgrading Technology
题目链接:https://ac.nowcoder.com/acm/contest/886/J 题目大意 略. 分析 见代码. 代码如下 #include <bits/stdc++.h> u ...
- 2019牛客多校第六场H Pair(数位DP 多个数相关)题解
题意: 传送门 给你\(A,B,C\),要求你给出有多少对\((x, y)\)满足\(x\in [1,A],y\in [1,B]\),且满足以下任意一个条件:\(x \& y > C\) ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...
随机推荐
- R 保存包含中文的 eps 图片--showtext
来自统计之都,感谢 Ihavenothing(http://cos.name/cn/profile/81532) 详情参考:http://cos.name/cn/topic/151358?replie ...
- Buy Tickets 【POJ - 2828】【线段树】
题目链接 有N次操作,每次都是将第i个数放置在第pos个数的后面,并且这个数的值是val. 这个线段树的思维确实很好,我们可以发现,后面放进去的数,一定是强制位置的,而前面放的数,会随着后面的数进入而 ...
- POJ 3281 网络流 拆点保证本身只匹配一对食物和饮料
如何建图? 最开始的问题就是,怎么表示一只牛有了食物和饮料呢? 后来发现可以先将食物与牛匹配,牛再去和饮料匹配,实际上这就构成了三个层次. 起点到食物层边的容量是1,食物层到奶牛层容量是1,奶牛层到饮 ...
- Web控件中Eval()的使用
1.使用Eval()绑定数据时使用三元运算符 <%#Eval("hg_A").ToString()=="1"?"通过":Eval(&q ...
- docker实现分布式项目部署
docker的安装及基本命令这里就略过了,可以看我的这篇笔记https://www.cnblogs.com/pyweb/p/11351878.html. 这次需要在docker上部署两个项目,整体的流 ...
- php跨域的几种方式
PHP实现跨域的几种形式 1.JSONP(JSON with padding)原理 利用html里面script标签可以加载其他域下的js这一特性,使用script src的形式来获取其他域下的数据, ...
- javaweb的Filter过滤器设置全站编码
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
- resultType和resultMap一对一查询小结
resultType和resultMap一对一查询小结 SELECT orders.*, USER .username,USER.birthday,USER.sex,USER.address FROM ...
- idea2019.1 永久破解 亲测可用
idea2019突然注册码突然失效了,搜了很多破解办法,这个还是有效的:https://www.jianshu.com/p/b6dd43618a66
- Oracle PL/SQL基础
1.下载sql developer数据库连接可视化工具 连接地址:点我下载 下载完成,安装有Java环境,解压即可运行,也可以在linux系统中运行.