Farmer John 的远房亲戚 Ben 是一个疯狂的科学家。 通常这会在家庭聚会时造成不小的摩擦,但这偶尔也会带来些好处,尤其是当 Farmer John 发现他正面对一些有关他的奶牛们的独特而不寻常的问题时。 Farmer John 当前正面对一个有关她的奶牛们的独特而不寻常的问题。 他最近订购了 N 头奶牛,包含两种不同品种:荷斯坦牛和更赛牛。 他在订单中用一个长为 N 的字符串来指定奶牛,其中的字符为 H(表示荷斯坦牛)或 G(表示更赛牛)。 不幸的是,当这些奶牛到达他的农场,他给她们排队时,她们的品种组成的字符串与原先的不同。 我们将这两个字符串称为 A 和 B,其中 A 是 Farmer John 原先想要的品种字符组成的字符串,B 是他的奶牛们到达时组成的字符串。 Farmer John 并没有简单地检查重新排列 B 中的奶牛是否能得到 A,而是请他的远房亲戚 Ben 利用他的科学才华来解决这一问题。 经过数月的研究,Ben 发明了一台不同寻常的机器:奶牛品种转换机3000,能够选择任意奶牛组成的子串并反转她们的品种:在这个子串中的所有 H 变为 G,所有 G 变为 H。 Farmer John 想要求出将他当前的序列 B 变为他本来订购时想要的 A 需要使用这台机器的最小次数。 然而,Ben 的疯狂的科学家技能并不会处理开发奇异机器以外的事,所以你需要帮助 Farmer John 解决这个计算难题。
输入格式 输入的第一行包含 N,以下两行包含字符串 A 和 B。每个字符串均包含 N 个字符,字符均为 H 和 G 之一。
#include<iostream> usingnamespacestd; constint N = 1005; char a[N],b[N];
intmain(){ int n; cin >> n; for (int i = 0;i < n;i ++) cin >> a[i]; for (int i = 0;i < n;i ++) cin >> b[i]; int ans = 0; for (int i = 0;i < n - 1;i ++){ if (a[i] != b[i] && a[i+1] == b[i+1]) ans ++; } // 特判最后一个位置 if (a[n-1] != b[n-1]) ans ++; cout << ans; return0; }
#include<iostream> usingnamespacestd; constint N = 1005; char a[N],b[N];
intmain(){ int n; cin >> n; for (int i = 0;i < n;i ++) cin >> a[i]; for (int i = 0;i < n;i ++) cin >> b[i]; int ans = 0; for (int i = 0;i < n;i ++){ if (a[i] != b[i]){ int j = i + 1; while (j < n && a[j] != b[j]) j ++; ans ++; i = j; } } cout << ans; return0; }
由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。 尽管他尽了最大努力使他的 N 头奶牛们践行“社交距离”,还是有许多奶牛不幸染上了疾病。 编号为 1…N 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 i 位于位置 xi。 Farmer John 知道存在一个半径 R,任何与一头被感染的奶牛距离不超过 R 单位的奶牛也会被感染(然后会传染给与其距离 R 单位内的奶牛,以此类推)。 不幸的是,Farmer John 并不确切知道 R 的值。 他只知道他的哪些奶牛被感染了。 给定这个数据,求出起初感染疾病的奶牛的最小数量。
输入格式 输入的第一行包含 N。 以下 N 行每行用两个整数 x 和 s 描述一头奶牛,其中 x 为位置,s 为 0 表示健康的奶牛,1 表示染病的奶牛,并且所有可能因传播而染病的奶牛均已染病。
#include<bits/stdc++.h> usingnamespacestd; typedefpair<int,int> PII; #define fi first #define se second constint N = 1005; PII q[N];
intmain(){ int n; cin >> n; for (int i = 0;i < n;i ++) cin >> q[i].fi >> q[i].se; sort(q,q + n); int r = 1e7; for (int i = 0;i < n - 1;i ++){ // 求传播半径上限 if (q[i].se != q[i+1].se) r = min(r,q[i+1].fi - q[i].fi); } r --; int ans = 0; for (int i = 0;i < n;i ++){ // 双指针求连通块数量 if (q[i].se){ int j = i + 1; while (j < n && q[j].se && q[j].fi - q[j-1].fi <= r) j ++; ans ++; i = j - 1; } } cout << ans; return0; }
每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N 朵花(五颜六色的雏菊),编号为 1…N,排列成一行。 花 i 有 pi 朵花瓣。 作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。 具体地说,对于每一对满足 1≤i≤j≤N 的花 (i,j),Bessie 会给从花 i 到花 j 之间的所有花(包括 i 和 j)拍一张照。 后来 Bessie 查看这些照片时注意到有些照片里存在「平均」的花——一朵恰好有 P 朵花瓣的花,其中 P 等于照片中所有花的花瓣数量的平均值。 Bessie 的照片中有几张存在平均的花?
#include<bits/stdc++.h> usingnamespacestd; constint N = 105; int q[N];
intmain(){ int n; cin >> n; for (int i = 0;i < n;i ++) cin >> q[i]; int ans = 0; for (int i = 0;i < n;i ++) for (int j = i,s = 0;j < n;j ++){ s += q[j]; int cnt = j - i + 1; if (s % cnt == 0){ for (int k = i;k <= j;k ++){ if (q[k] == s / cnt){ ans ++;break; } } } } cout << ans; return0; }