P1069 [NOIP2009 普及组] 细胞分裂
# include <iostream>
# include <cstdio>
# include <stdio.h>
using namespace std ;
int n ;
int m1 , m2 ;
int si ;
bool prime[ 30005 ] ;
int n_prime = 0 ;
int p_queue[ 30005 ] ;
void init_prime ( int num) {
for ( int i = 2 ; i <= num; ++ i)
prime[ i] = true ;
for ( int i = 2 ; i <= num; ++ i) {
if ( prime[ i] ) {
n_prime++ ;
p_queue[ n_prime] = i ;
}
for ( int j = 1 ; j <= n_prime && i * p_queue[ j] <= num; ++ j) {
prime[ i * p_queue[ j] ] = false ;
if ( i % p_queue[ j] == 0 )
break ;
}
}
return ;
}
int timee[ 30004 ] ;
void get_si_prime ( int s) {
for ( int i = 1 ; i <= n_prime && s != 1 ; ++ i) {
while ( s % p_queue[ i] == 0 ) {
s /= p_queue[ i] ;
timee[ p_queue[ i] ] ++ ;
}
}
return ;
}
int m1_time[ 30005 ] ;
int ans = 30050 ;
int main ( ) {
init_prime ( 30000 ) ;
scanf ( "%d" , & n) ;
scanf ( "%d%d" , & m1 , & m2) ;
for ( int i = 1 ; i <= n_prime && m1 != 1 ; ++ i) {
while ( m1 % p_queue[ i] == 0 ) {
m1 /= p_queue[ i] ;
m1_time[ p_queue[ i] ] ++ ;
}
}
for ( int i = 1 ; i <= 30000 ; ++ i)
m1_time[ i] *= m2 ;
for ( int i = 1 ; i <= n; ++ i) {
for ( int j = 1 ; j <= 30000 ; ++ j)
timee[ j] = 0 ;
scanf ( "%d" , & si) ;
get_si_prime ( si) ;
bool flag = false ;
int maxx = 0 ;
for ( int j = 1 ; j <= 30000 ; ++ j) {
if ( m1_time[ j] == 0 )
continue ;
if ( m1_time[ j] > 0 && timee[ j] == 0 ) {
flag = true ;
break ;
}
if ( m1_time[ j] <= timee[ j] )
continue ;
int level = 1 ;
int a = m1_time[ j] ;
int b = timee[ j] ;
while ( a > b * level) {
level++ ;
}
if ( level == 1 )
level = 0 ;
maxx = max ( maxx , level) ;
}
if ( flag)
continue ;
ans = min ( ans , maxx) ;
}
if ( ans == 30050 )
printf ( "-1" ) ;
else
printf ( "%d" , ans) ;
return 0 ;
}
P1280 尼克的任务
# include <iostream>
# include <cstdio>
# include <stdio.h>
# include <algorithm>
using namespace std ;
int n , k ;
int sum[ 10005 ] , num = 1 , f[ 10005 ] ;
struct minute {
int start , end ;
} tim[ 10001 ] ;
bool cmp ( minute a , minute b) {
return a. start > b. start ;
}
int main ( ) {
scanf ( "%d%d" , & n , & k) ;
for ( int i = 1 ; i <= k; ++ i) {
scanf ( "%d%d" , & tim[ i] . start , & tim[ i] . end) ;
sum[ tim[ i] . start] ++ ;
}
sort ( tim+ 1 , tim+ 1 + k , cmp) ;
for ( int i = n; i >= 1 ; -- i) {
if ( sum[ i] == 0 )
f[ i] = f[ i+ 1 ] + 1 ;
else
for ( int j = 1 ; j <= sum[ i] ; ++ j) {
if ( f[ i+ tim[ num] . end] > f[ i] )
f[ i] = f[ i+ tim[ num] . end] ;
num++ ;
}
}
printf ( "%d" , f[ 1 ] ) ;
return 0 ;
}