计蒜之道 初赛 第一场 题解

搜狗输入法的分词算法

搜狗输入法最近的用户输入中出现了一种新的输入模式,形如 “0k1234567”,搜狗的工程师发现这一模式后了解到,这是一种新被提出的对于十五进制数字的标记模式,其中 “0k” 是标记进制为15的前缀标记,之后的部分 “1234567” 是实际的十五进制的数字串。

在发现这一标记模式后,搜狗的工程师开始尝试在已有的分词算法上进一步加入对于十五进制数字串的处理,把网页上的这种形式的 15 进制数正确地提取出来。我们知道,标记十五进制的 “0k” 中 k 必须是小写,数字 0 到 14 在这套标记模式下会被依次表示为:0k0, 0k1, ..., 0k9, 0kA, 0kB, 0kC, 0kD, 0kE。也就是说 15 进制数字中只会出现 0-9、k 和 A-E。

值得注意的是,数字表示中不能有多余的 0,比如 0k05 是不能被当做一个十五进制数字的。另外,作为一种约定,当出现 “0k90k8” 时,只有 0k90 是符合期望的十五进制数字,即总是从左至右依次提取出最长的十五进制数字。如果希望表达 0k9 和 0k8 这两个数字的连写情况时,则会被写成 “0k9‘0k8” 这一的形式(单引号代表其他任意非数字字符)。

搜狗的工程师希望将用户输入中符合上述要求的所有十五进制数依次输出。你能帮他实现么?

输入格式

输入一行字符串 str (1 ≤ |str| ≤ 106),表示搜狗工程师得到的用户输入。用户输入中的字符一定是数字 (0 - 9) 或大小写英文字母 (a - z, A - Z)。

输出格式

输出包括若干行,每行输出一个提取出的十五进制数(形式如同:0k1234),分别对应输入字符串中含有的若干个符合标记模式的十五进制数字;输出时,请以数字在原字符串中的顺序依次输出。

样例1

输入:

sjfjfhua0kA0000lmNhdhahdfhGgdJG90K10k110k120kF

输出:

0kA0000
0k110

题意就是要找15进制数,简单的字符串处理就可以了。

#define N 1000050
#define M 100005
#define maxn 205
#define MOD 1000000000000000007
int n,len;
char str[N];
bool isNum(char c){
    if(c >='0' && c<='9') return true;
    if(c >='A' && c<='E') return true;
    return false;
}
int main()
{
    while(SS(str)!=EOF)
    {
        int st = -1,flag = 0;
        len = strlen(str);
        FI(len){
            if(st != -1){
                if(!flag){
                    if(str[i] == '0'){
                        printf("0k0\n");
                        st = -1;
                        flag = 0;
                        continue;
                    }
                }
                if(!isNum(str[i])){
                    if(flag){
                        for(int j = st;j<i;j++)
                            printf("%c",str[j]);
                        printf("\n");
                    }
                    st = -1;
                }
                flag++;
            }
            else if(st == -1 && str[i] == '0' && i <= len-1 && str[i+1] == 'k'){
                st = i;i++;flag = 0;
            }
        }
        if(st != -1 && flag){
           for(int j = st;j<len;j++)
                        printf("%c",str[j]);
            printf("\n");
        }
    }
    return 0;
}

工作区的颜值选择(简单)

360硅谷范的工作区被划为了 n 行 m 列的连续工位,每个工位上可以安排一名员工工作。当第 i 行第 j 列(行和列都从1开始编号)的工位中坐着一个颜值为 C 的员工时,公司会需要付出的成本是 (|C + i + j| ⊕ U) * W(其中⊕是按位异或符号)。U 是这个工位的风水指数,W 是这个工位上接收到360安全路由发出的wifi信号强度。

比较有意思的是,两个相邻的工位(同行相邻列或同列相邻行)上坐着颜值为 C1 和 C2 的员工时,公司会额外付出
|C1 + C2| 的成本。

找到一种方案,决定每个工位上的员工应有的颜值 C (|C| ≤ k),使得公司最终需要付出的总成本最小。并输出需要付出的最小总成本。

输入格式

第一行输入三个整数 n, m, k (1 ≤ k ≤ 30) 分别表示工区的长、宽、和颜值绝对值的上限。

接下来读入两个 n 行 m 列的整数矩阵。

第一个矩阵表示每个工位的风水指数 Ui,j (1 ≤ Ui,j ≤
30)。

第二个矩阵表示每个工位收到360安全路由发出的wifi信号强度Wi,j (1 ≤ Wi,j ≤
30 且 Wi,j 为整数)。

对于简单版本,1 ≤ n ≤ 2,1 ≤ m ≤ 3;

对于中等版本,n = 2, 1 ≤ m ≤ 30;

对于困难版本,1 ≤ n, m ≤ 30。

输出格式

输出一个数,表示公司需要付出的最小成本。

样例1

输入:

2 2 2
1 0
1 0
1 1
1 1

输出:

11

提示信息

样例的填充方案如下:

-1 1

0 -1

使用的深搜,一个个试,加上了小小的剪枝,水平有限,只能过简单,复杂度是指数级的,如果有好的算法,希望指点下。

#define N 205
#define M 100005
#define maxn 205
#define MOD 1000000000000000007
int n,m,k;
int u[N][N],w[N][N],ans,vis[N][N],land[N][N],maxx[N][N];
int dir[2][2] = {{-1,0},{0,-1}};
bool isRight(int x ,int y){
    if(x>=0 && x<n && y <m && y>=0) return true;
    return false;
}
int CheckAns(int sum,int i,int j){
        sum += (abs(land[i][j] + i + 1 + j + 1) ^ u[i][j]) * w[i][j];
        for(int s = 0;s<2;s++){
            int xx = i + dir[s][0],yy = j + dir[s][1];
            if(isRight(xx,yy)){
                sum += abs(land[i][j] + land[xx][yy]);
            }
        }
    return sum;
}
int DFS(int x,int y,int sum){
    if(sum > ans) return 0;
    if(x == n-1 && y == m-1){
        for(int i = -k ;i<=k;i++){
            land[x][y] = i;
            ans = min(CheckAns(sum,x,y),ans);
        }
       return 0;
    }
    for(int i = -k ;i<=k;i++){
        land[x][y] = i;
        if(y < m - 1) {
            DFS(x,y + 1,CheckAns(sum,x,y));
        }
        else if(y == m - 1){
            DFS(x+1,0, CheckAns(sum,x,y));
        }
    }
    return 0;
}
int main()
{
    while(S2(n,m)!=EOF)
    {
        S(k);
        FI(n)FJ(m)S(u[i][j]),maxx[i][j] = INF;
        FI(n)FJ(m)S(w[i][j]);
        ans = 0;
        FI(n){
            FJ(m){
                ans +=(( i + 1 + j + 1) ^ u[i][j]) * w[i][j];
            }
        }
        DFS(0,0,0);
        printf("%d\n",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 19:02:05

计蒜之道 初赛 第一场 题解的相关文章

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务 1 /* QYP kuai wo dai ma*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<iomanip> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cstdio> 8 #include<queue> 9 #include<ctime

计蒜之道 初赛第一场B 阿里天池的新任务(简单)

阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 tt,判断它在另一个根据规则生成的 DNA 碱基序列 ss 中出现了多少次. 首先,定义一个序列 ww: \displaystyle w_{i} = \begin{cases}b, & i = 0\\(w_{i-1} + a) \mod n, & i > 0\end{cases}w?i??={?b,?(w?i−1??+a)modn,???i=0?i>0?? 接下来,定义长度为 nn 的 DNA 碱

2017 计蒜之道 初赛 第一场 A、B题

A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.我们可以用坐标系来描述棋盘: 如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三.现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的.请你帮小红计算他成三的线段数. 样例对应的棋盘如下: 输入格式 输入第一行两个整数 n,m(3 \le n, m \le

计蒜之道 初赛 第二场 题解

人人都有极客精神 人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目.海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位.月份占 2 位.天数占 2 位). 日期电子屏幕上每个数字对应的显示如下图: <img src="http://res.jisuanke.com/img/nanti/428.png" <=&

2018 计蒜之道 初赛 第一场

百度无人车 二分 #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 2e4 + 10; LL a[maxn]; int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%lld", a + i); LL p, s; scanf("

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

/** 题目:2017计蒜之道 初赛 第二场 百度的科学计算器(简单) 链接:https://nanti.jisuanke.com/t/15504 题意:给一个合法的表达式,包含加号+.减号-.括号().数字常量,表达式中没有空格. 输入数据保证数字常量以及计算过程中数值绝对值均不超过 10^12??,对于浮点型数值常量,保证小数点后不超过 666 位. 思路:暴力模拟:python有函数可以直接调用. 坑点:如果表达式中出现过浮点数,那么输出结果保留6位小数, 否则输出整数,不出现小数. */

2018 计蒜之道 初赛 第二场

签到完看到C没什么人过就溜乐. A.淘宝的推荐系统 直接DP,时间复杂度$O(∑nd)$ #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se s

计蒜之道 初赛 第三场 题解

腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这其中有的信号的作用范围近,有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在任何一个方向上信号强度都一致的. 已知用户面向北方拿着自己的手机,在不同方位的各种信号覆盖区域可以被抽象成以用户为圆心的一系列扇形.已知每个扇形的半径 r,和每个扇形的两条边相对于正东方向的夹角度数.每个信号覆盖区域抽象出的扇形都可以通过从第一条边逆时针旋转到第二条边画出. <img src="http://res.ji

2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数