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 ;
}