农夫约翰拥有 N 头有斑点的牛和 N 头没有斑点的牛。 他刚刚完成了牛遗传学课程,他确信奶牛上的斑点是由牛基因组突变引起的。 农夫约翰花了大价钱对他的奶牛的基因组进行了测序。 每个基因组都是一个由四个字符 A,C,G,T 构成的长度为 M 的字符串。 当他统计得到的奶牛的基因组序列时,可以得到一个如下所示的表:(此时,N=3) 位置 : 1234567 ... M
斑点牛 1: A A T C C C A ... T 斑点牛 2: G A T T G C A ... A 斑点牛 3: G G T C G C A ... A
普通牛 1: A C T C C C A ... G 普通牛 2: A C T C G C A ... T 普通牛 3: A C T T C C A ... T 通过仔细观察该表,他发现通过位置 2 的字符足以判断奶牛是否存在斑点。 也就是说,仅通过查看这个位置上的字符,农夫约翰就可以判断他的哪些奶牛有斑点,哪些没有斑点。(在这里,A 和 G 表示有斑点,C 表示无斑点,T 无关紧要,因为没有任何一头牛的第二个位置上的字符是 T) 位置 1 上的字符不足以判断奶牛是否存在斑点,因为 A 既可以表示有斑点也可以表示无斑点。 给定约翰的奶牛的基因组序列列表,请你计算可以单独用来判断奶牛是否存在斑点的位置的数量。
输入格式 第一行包含两个整数 N 和 M。 接下来 N 行,每行包含一个长度为 M 的字符串,用来描述斑点牛的基因组序列。 再接下来 N 行,每行包含一个长度为 M 的字符串,用来描述普通牛的基因组序列。
#include<iostream> #include<algorithm> usingnamespacestd; constint N = 105; int n,m; string a[N],b[N]; bool fa[N][4],fb[N][4];
intmain(){ cin >> n >> m; unordered_map<char,int> p = {{'A',0},{'C',1},{'G',2},{'T',3}}; for (int i = 0;i < n;i ++) cin >> a[i]; for (int i = 0;i < n;i ++) cin >> b[i]; int res = 0; for (int j = 0;j < m;j ++){ for (int i = 0;i < n;i ++){ fa[j][p[a[i][j]]] = true; // 第j个位置(从0开始)是否有'A','C',...等基因 fb[j][p[b[i][j]]] = true; } bool flag = true; for (int i = 0;i < 4;i ++){ if (fa[j][i] && fb[j][i]){ // 斑点牛和无斑点牛该位置有相同基因,说明没用 flag = false;break; } } if (flag) res ++; } cout << res; return0; }
#include<bits/stdc++.h> usingnamespacestd; typedefpair<int,int> PII; constint N = 105; int n; PII p[N];
intmain(){ cin >> n; for (int i = 0;i < n;i ++){ cin >> p[i].first >> p[i].second; } sort(p,p + n); int ans = 0; for (int i = 0;i < n;i ++){ // 枚举需要解雇的奶牛编号 int last = -1,sum = 0; // last和sum必须放在两层循环之间! for (int j = 0;j < n;j ++){ if (i != j){ // 解雇第i头奶牛,计算解雇后的最大覆盖长度 int start = p[j].first,end = p[j].second; if (start > last){ sum += end - start; last = end; }elseif (last < end){ sum += end - last; last = end; } } } ans = max(ans,sum); } cout << ans; return0; }
为了准备即将到来的蹄球锦标赛,Farmer John 正在训练他的 N 头奶牛(方便起见,编号为 1…N)进行传球。 这些奶牛在牛棚一侧沿直线排列,第 i 号奶牛位于距离牛棚 xi 的地方。 每头奶牛都在不同的位置上。 在训练开始的时候,Farmer John 会将若干个球传给不同的奶牛。 当第 i 号奶牛接到球时,无论是从 Farmer John 或是从另一头奶牛传来的,她会将球传给最近的奶牛(如果有多头奶牛与她距离相同,她会将球传给这些奶牛中最左边的那头奶牛)。 为了使所有奶牛都有机会练习到传球,Farmer John 想要确保每头奶牛都持球至少一次。 帮助他求出为了达到这一目的他开始时至少要传出的球的数量。 假设他在开始的时候能将球传给最适当的一组奶牛。
输入格式 输入的第一行包含 N。 第二行包含 N 个用空格分隔的整数,其中第 i 个整数为 xi。
输出格式 输出 Farmer John 开始的时候最少需要传出的球的数量,使得所有奶牛至少持球一次。