N-41. Gene Pattern

二更:2020.4.27
读入其实可以这样读:

   int cnt = 1; 
   while (scanf("%d", &a[cnt][1])!= EOF) {  
      for (int i = 2; i <= n; i++) scanf("%d", &a[cnt][i]); 
      cnt++;
   } 
   cnt--;

我一直以为while(scanf) 和while (scanf!=EOF)没有区别 , 哭。
这样在devC++里面就可以按CTRL-z强制结束程序得出结果了。

Description

转座子指一段可以从原位上单独复制或断裂下来,环化后插入另一位点,并对其后的基因起调控作用的DNA序列,即转座子在基因序列中没有特定位置。已知某原核生物的某段基因中含有一个转座子。现给出多个个体相关基因序列(用连续正整数编号基因片段),设计程序找出转座子。

Input

第一行,一个数字n,表示相关基因序列所含有基因片段的个数。

第i(100>=i>=2)行,每行n个数字,表示第(i-1)个个体相关基因序列。

Output

一个数字,即转座子对应编号。若无法确定转座子,输出“-1”.

思路:这个题的输入也太离谱了,一年来不管是写c语言题还是算法题都没见过这样输入的
读入就强制读入一个100 行 n 列 的二维矩阵, 根据每行第一个数是否为0来找出有效行有多少行

 for (int i = 1; i <= 100; i++) {
  	for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]);
  }

我们把这个题用逆序数的思想转化:
比如说:正确的序列是 3 2 4 5 6 9 8 10 7 1

我们令b[3] = 1 , b[2] = 2 , ... , b[1] = 10;

这样我们就可以记录元素间顺序:
b[3] < b[2] 3在2的前面
b[2] < b[4] 2在4 的前面
...

那么b数组就可以记录正确的顺序关系

我们假设有一个错误的序列
3 2 7 4 5 6 9 8 10 1
在这里其他数都满足b[a[i][j]] < b[a[i][j+1]]的顺序,只有 7 和 4,b[7] > b[4] 但是在该序列中7却在4的前面,这样就产生了一个逆序对;那么要么是7是转座子。要么是4是转座子,我们把它们的可疑度 c[7], c[4]加上1;
处理完所有行之后,可疑度最大的数就是转座子。
如果有多个数可疑度一样,那么它们都有可能是转座子,我们输出-1;
后来发现,定序的时候不是正确的序列也可以。
就是说用3 2 4 5 6 9 8 10 7 1 或者 3 2 7 4 5 6 9 8 10 1 定序都是可以的。
所以说我们默认用第一行定序

#include <stdio.h>  
#include <math.h>  
int a[110][110] = {0}, b[110] = {0}, c[110] = {0}, max = 0, ans = 0;  
int main () {  
    int n, cnt = 1, cnt2 = 0;
    scanf("%d", &n);  
  	for (int i = 1; i <= 100; i++) {
  		for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]);
  }
  	for (int i = 1; i <= 100; i++ ) if (a[i][1] != 0 && a[i+1][1] == 0 ) cnt = i; // cnt是有效的行数
	for (int i = 1; i <= n; i++) b[a[1][i]] = i;
	for (int i = 1; i <= cnt; i++) {
		for (int j = 1; j < n; j++) {
			if (b[a[i][j]] > b[a[i][j + 1]]) c[a[i][j]]++, c[a[i][j + 1]]++; // 存在一个逆序,这个逆序对的两个数都有嫌疑
		}
	}	
	for (int i = 1; i <= n; i++) {
		if(c[i] > max) max = c[i], ans = i;
	}
	for (int i = 1; i <= n; i++) {
		if (c[i] == max) cnt2++; // 总共有多少个数可疑度相同
	}
	if (cnt2 > 1 || ans == 0) printf("-1\n");
	else printf("%d\n", ans);
    return 0;  
} 
posted @ 2022-04-20 21:12  misasteria  阅读(143)  评论(0编辑  收藏  举报