蓝桥杯 A Careful Approach (枚举+贪心+二分)

CHUAN SONG MEN

一:

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

猜你喜欢

转载自blog.csdn.net/curtern/article/details/88410974
今日推荐