补题赛(5.17)

问题 A: 数格子

题目描述

给你一个整数n,你需要求出从1×1开始扩展n−1次的格子数量。
每一次扩展,所有与当前格子有相邻(上下左右)的格子都会被扩展进答案里。如下图为n≤4的情形:

输入

输入一个正整数n(1≤n≤106)。

输出

输出从1×1开始扩展n−1次的格子数量。

样例输入

2

样例输出

5

提示

对于70%的数据,1≤n≤100。
对于100%的数据,1≤n≤106

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define IOS ios_base::sync_with_stdio(false),cin.tie(nullptr);
const int MAX_N = 1e2 + 50 , N = 1e7 + 50,mod = 10000007;

int n;
ll s = 1, p = 4;
int main() {
    IOS;
    cin >> n;
    if (n == 1)cout << 1 << endl;
    else {
        for (int i = 0; i < n - 1; i++) {
            s += p;
            p += 4;
        }
    }
    cout << s << endl;
    return 0;
}

问题 B: 字符差异

题目描述

给定两个只包含0、1的字符串a和b,它们的长度满足|a|≥|b|(|a|、|b|表示a、b字串的长度),可以取出a中长度为|b|的|a|−|b|+1个连续子串,设为c。
定义差异度imgf(b, c) = ,即它们在对应位置上有不同的值的数量,求有多少个f(b,c)的值是偶数。
例如:a=01100010,b=00110,可以从a中取出4个长度为|b|的子串,分别为:01100,11000,10001,00010。
f(00110,01100)=2
f(00110,11000)=4
f(00110,10001)=4
f(00110,00010)=1
故有f(b,c)为偶数的数量为3。

输入

第一行输入字符串a(1≤|a|≤106)。
第一行输入字符串b(1≤|b|≤|a|)。

输出

输出f(b,c)为偶数的个数。

样例输入

01100010
00110

样例输出

3

提示

对于50%的数据,1≤|a|≤500,1≤|b|≤|a|。
对于100%的数据,1≤|a|≤106,1≤|b|≤|a|。

代码***(位运算)***

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define IOS ios_base::sync_with_stdio(false),cin.tie(nullptr);
const int MAX_N = 1e2 + 50 , N = 1e7 + 50,mod = 10000007;

int sum, ans;
string a,b;
int main() {
    IOS;
    cin >> a >> b;
    for (int i = 0; i <= b.size() - 1; i++) sum ^= (a[i] - '0') ^ (b[i] - '0');
    if (!sum) ans++;
    for (int i = b.size(); i <= a.size() - 1; i++) {
        sum ^= (a[i - b.size()] - '0') ^ (a[i] - '0');
        if (!sum) ans++;
    }
    cout << ans << endl;
    return 0;
}

问题 C: 传送门

题目描述

用一个n*n的矩阵表示一个岛屿,岛屿中有陆地和水域,陆地用0表示,水域用1表示,你只能在陆地上行走,在陆地上行走不需要花费任何费用,给定起点的坐标(sx,sy)与终点坐标(ex,ey),保证这两个点必定是陆地。
你可以在任意两块陆地上建立一个传送门且最多只能建一个传送门,传送门可以使两个点互达,费用是两点间横坐标、纵坐标的差的平方和,即(sx-ex)2+(sy-ey)2
求从起点起到终点的最小花费,若不需要建传送门可直接到达终点则花费为0。

输入

有多组测试数据。
第一行输入一个正整数t(2≤t≤10),表示测试数据的组数。
对于第组测试数据输入如下:
第一行输入一个正整数n(1≤n≤100)。
第二行输入起点坐标sx,sy。
第三行输入终点坐标ex,ey。
接下来的n行输入一个n*n的01矩阵,0与1之间无空格,详见样例。

输出

对于每组测试数据输出一行,即一个整数表示该组数据的最小花费。

样例输入

3
5
1 1
5 5
00001
11111
00111
00110
00110
3
1 3
3 1
010
101
010
2
1 1
2 2
00
10

样例输出

10 8
0

提示

对于100%的数据,2≤t≤10,1≤n≤100。

代码

问题 D: ACM 任务

题目描述

萨格勒布大学、伊万大学和古斯塔夫大学的团队正在摩洛哥参加ACM国际大学生程序设计大赛的世界总决赛。他们的技术指导教练Goran提出了一个对付总决赛的无敌策略。
开始,每个团队成员很快预估出N个任务的难度。这些难度用数字1到5来表示,其含义如下:
1 呵呵呵
2 来吧!
3 OK没问题。
4 嗯……
5 你疯了吗?
之后,他们将分配他们之间的任务。为了简单起见,这些任务将被分成三部分,每个团队的成员将获得一个非空的连续任务数组。分配的目的是使所估计的难度总和最小。
你的任务是计算最小可能的总和。

输入

第一行输入一个整数N(3≤N≤150,000),表示任务的数量。
接下来的三行每行包含N个整数(这些数的范围是[1,5]之间的整数),分别给出每个团队估计的任务难度。第一行对应于萨格勒布大学团队的估计难度,第二行是伊万大学,第三行是古斯塔夫大学。

输出

输出共一行一个整数,即最小的难度总和。

样例输入

3
1 3 3
1 1 1
1 2 3

样例输出

4

提示

萨格勒布大学团队处理第一个任务,古斯塔夫大学处理第二个任务,伊万大学处理第三个任务。

对于30%的数据:3≤N≤100。
对于60%的数据:3≤N≤5,000。
对于100%的数据:3≤N≤150,000

代码

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
int num[6][3]= {{0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,0,1},{2,1,0}};
int n,ans=0x3f3f3f3f,a[3][150010],f[150010][3];
int main() {
    cin >> n;
    For(i, 0, 2) For(j, 1, n) cin >> a[i][j];
    For(x, 0, 5) {
        memset(f, INT_MAX, sizeof(f));
        f[0][0] = 0;
        For(i, 1, n) {
            f[i][0] = f[i - 1][0] + a[num[x][0]][i];
            if (i >= 2) f[i][1] = min(f[i - 1][0], f[i - 1][1]) + a[num[x][1]][i];
            if (i >= 3) f[i][2] = min(f[i - 1][1], f[i - 1][2]) + a[num[x][2]][i];
        }
        ans = min(ans, f[n][2]);
    }
    cout << ans;
}

问题 E: 高校排名

题目描述

大学排名在现在已经非常流行.比如:在http://www.netbig.com你就能得到关于中国大学排名信息.
我们知道,在一个大学里有很多系,某个大学的有些系很出名,但另一些系不出名,因此有很多关于系的排名。到底哪个大学好呢,波布博士提出了一个新概念“绝对更好”,来使这个难题被部份解决。下面我举一个例子来说明这个概念。
现有三所大学:X,Y,Z,每个大学有三个系:CS,EF,FLS;关于这三个大学三个系排名如下:
CS系:X>Y>Z (X>Y就是说x的CS专业比Y的好)
EF系:X>Z>Y
FLS系:Z>X>Y
显然,X大学的各个系都比Y大学好,所以X大学绝对比Y大学好。我们运用这上概念来比较大学的优劣。
现在,波布博士有一份完整的各个大学不同系的排名,他想找出能够比较绝对好的K所大学(U1,U2,U3…Uk),Ui一定比Uj(i<j)好,并找出这个K的最大值。

输入

第一行有两个数N和M(0<N,M<=100),分别表示有N所大学,每所大学都有M个系。接下来M行中,第i行有N所大学的编号,代表第i个系N所大学的排名,靠前的越好。

输出

输出只有一个整数K。

样例输入

3 3
1 2 3
1 3 2
3 1 2

样例输出

2

代码


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值