一:
fmod函数:
头文件 <math.h>
函数原型: float fmod(float x,float y) ;
返回浮点数x除于浮点数y的余数
modf()函数
modf()是分解x,以得到x的整数和小数部分。
double modf(double x,double *integer)
返回x的小数部分,符号与x相同。x是浮点值,integer是指向一个对象的指针,保留x的整数部分
二:
二分,对答案可能存在的区间进行二分查找,当误差小于eps时,就认为找到答案
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define eps (1e-6)
using namespace std;
const int maxn = 10;
int num[maxn],pos[maxn];
struct node{
int a,int b;
}s[maxn];
int n;
bool check(double len){
int x = s[pos[0]].a ;
for(i = 2;i <= n;i++){
x = x + len;
if(x > s[pos[i].b])
return false;
else
x = max(s[pos[i-1]].a,x);
}
return true;
}
int main(){
int t = 0;
while(~scanf("%d",&n)!= EOF){
t++;
if(!n)
break;
for(int i = 1;i <= n;i++){
int l,r;
cin>>s[i].a>>s[i].b;
}
int ans = 0;
do{
for(int i = 1 ;i <= n;i++)
pos[num[i]] = 1;
int l = 0,r = 1440;
int mid = (l+r)/2;
while(r - l > eps){
mid = (l+r)/2;
if(check(mid)){
l = mid;
}else{
r = mid;
}
}
ans = max(ans,mid);
}while(next_permutation(num + 1,num + n + 1));
int f = int(ans);
printf("Case %d: %d:%02d",t,f,int(fmod(ans*60,60)+0.5);
}
return 0;
}