題意:給你每個理發師的理發時間,問你排在隊列中的第N個位置,問你應該被哪個理發師剪發。
解題思路:二分時間,看這個時間到第幾個人理發了,然后找到臨界值,看這個值的時候有那些理發師接待了新旅客的,即可找到那個理發師。
解題代碼:


1 // File Name: b.sample.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月18日 星期六 09時05分30秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 LL a[1005]; 28 LL b , n ; 29 LL count(LL t){ 30 LL sum = 0 ; 31 for(int i = 1;i <= b;i ++) 32 { 33 sum += (t/a[i]) + 1 ; 34 } 35 return sum; 36 } 37 LL fen(LL l , LL r){ 38 LL m = (l + r)/2; 39 while(l<= r){ 40 //printf("***\n"); 41 m = (l + r)/2; 42 LL t = count(m); 43 if(t >= n){ 44 r = m - 1; 45 }else l = m + 1; 46 } 47 return l ; 48 } 49 int main(){ 50 // freopen("B-large.in","r",stdin); 51 // freopen("output","w",stdout); 52 LL T; 53 scanf("%lld",&T); 54 for(int ca = 1; ca <= T ;ca ++){ 55 scanf("%lld %lld",&b,&n); 56 for(LL i = 1;i <= b;i ++) 57 scanf("%lld",&a[i]); 58 printf("Case #%d:",ca); 59 if(n <= b ) 60 { 61 printf(" %lld\n",n); 62 continue; 63 } 64 LL t = fen(1,1e15); 65 LL num = count(t-1); 66 for(int i = 1;i <= b;i ++){ 67 if(t% a[i] == 0){ 68 num ++; 69 } 70 if(num == n) 71 { 72 printf(" %d\n",i); 73 break; 74 } 75 } 76 77 } 78 79 return 0; 80 }
?