现在的位置: 首页 > 竞赛 > 正文

细胞分裂

2011年03月27日 竞赛 ⁄ 共 203字 ⁄ 字号 暂无评论

算是很难的题目了

准备测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
 
#define MM_SIZE 50
#define BIG_NUMBER 99999999
 
int bottle_cell[MM_SIZE+1];
int bottle_num[MM_SIZE+1];
 
void split_cell(int n, int n_cell[], int n_num[])
{
	int i, j, now;
	int t, count=0;
	t = sqrt(n+1);
 
	for (i=0; i<=MM_SIZE; i++) n_num[i]=0;
	for (i=2; i<=t; i++) {
		if (n%i!=0) continue;
		count++;
		n_cell[count] = i;	
		while (n % i ==0) {	
			n_num[count]++;
			n = n / i;
/*			printf("i=%d n=%d ",i,n);  */
		}
	}	
	if (count==0) {
		n_cell[1]=n;
		n_num[1]=1;
		count++;
	}
	n_num[0] = n_cell[0] = count;	
}
 
int calc_step(int cell, int num, int n_cell[], int n_num[])
{
	int i;
	int pos=0, now;
	int count=1;
/*	printf("call func: cell %d num %dn", cell, num);  */
	for (i=1; i<=n_cell[0]; i++)
		if (n_cell[i]==cell) pos=i;
/*	printf("pos=%dn", pos); */
	if (!pos) return 0;
	now = n_num[pos];
/*	printf("now=%d num=%dn", now, num); */
 
	if (num % n_num[pos] == 0) 
		count = num / n_num[pos];
	else
		count = 1 + num / n_num[pos];
 
	return count;
}
 
int main(int argc, char *argv[])
{
	int i, j, cur;
	int m1, m2;
	int n, t;
	int s[10000+1]; 
	int steps[10000+1];
	int n_cell[MM_SIZE];
	int n_num[MM_SIZE];	
	int no_answer;
	int step, max;
	int pos, min;
 
	scanf("%d", &n);
	scanf("%d%d", &m1, &m2);
	for (i=1; i<=n; i++)
 		scanf("%d", &s[i]);
 /*		
    printf("n=%dn", n);
    printf("m1=%d m2=%dn", m1, m2);
    for (i=1; i<=n; i++) printf("%d ", s[i]);
*/    
	if (m1==1) {
		printf("%dn", 0);
		return 0;
	}
 
	split_cell(m1, bottle_cell, bottle_num); 
	for (i=1; i<=bottle_num[0]; i++) { 
		bottle_num[i] *= m2;
/*		printf("num%d=%dn", i, bottle_num[i]); */
	}
 
 
	for (i=1; i<=n; i++) {
		split_cell(s[i], n_cell, n_num);
		max = 0;
		for (j=1; j<=bottle_num[0]; j++) {
			step = calc_step(bottle_cell[j], bottle_num[j], n_cell, n_num);
			if (step==0) {  break;  }
			if (step>max) max = step;
		}
		if (!step) 
			steps[i] = 0;
		else
			steps[i] = max;
/*		printf("max step=%dn", max);	*/
	}	
 
	min = BIG_NUMBER;
	for (i=1; i<=n; i++) {
		if (!steps[i]) continue;
		if (steps[i]<min) {
			pos = i;
			min = steps[i];
		}
	}
	if (min==BIG_NUMBER)
		printf("%dn", -1);
	else
		printf("%dn", min);	
 
	return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.