题目描述
Farmer John 的奶牛们最近成为了一个简单的数字游戏“FizzBuzz”的狂热玩家。这个游戏的规则很简单:奶牛们站成一圈,依次从一开始报数,每头奶牛在轮到她的时候报一个数。如果一头奶牛将要报的数字是 3 的倍数,她应当报“Fizz”来代替这个数。如果一头奶牛将要报的数字是 5 的倍数,她应当报“Buzz”来代替这个数。如果一头奶牛将要报的数字是 15 的倍数,她应当报“FizzBuzz”来代替这个数。于是这个游戏的开始部分的记录为:
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16 由于词汇的匮乏,奶牛们玩的 FizzBuzz 中用“Moo”代替了 Fizz、Buzz、FizzBuzz。于是奶牛版的游戏的开始部分的记录为: 1, 2, Moo, 4, Moo, Moo, 7, 8, Moo, Moo, 11, Moo, 13, 14, Moo, 16
给定 N(1≤N≤10^9),请求出这个游戏中第 N个被报的数。
输入
输入包含一个整数 N。
输出
输出游戏中被报出的第 N个数。
样例输入
4
样例输出
7
一个二分答案,二分+验证,再拉上一个结构体和快排,这道题就解完了。
判定
bool judge(long long x){
long long Start=0,s=0,num=0;
for(long long i=1;i<=m;i++){
Start=max(Start,a[i].x);
if(a[i].y>=Start){
num=1+(a[i].y-Start)/x;
s+=num;
qi=qi+num*x;
}
}
return (s>=n);
}
要开long long!!!!!!!!!!!!!!!!!!
完整代码
#includeusing namespace std; long long n,m,t,w,bao; struct no{ long long x,y; }a[100005]; bool judge(long long x){ //验证 long long Start=0,s=0,num=0; for(long long i=1;i<=m;i++){ Start=max(Start,a[i].x); if(a[i].y>=Start){ num=1+(a[i].y-Start)/x; s+=num; qi=qi+num*x; } } return s>=n; } bool cmp(no x,no y){ return x.x >n>>m; for(long long i=1;i<=m;i++) cin>>a[i].x>>a[i].y; sort(a+1,a+1+m,cmp); //排序 t=1;w=2e9; while(t<=w){ //二分 long long mid=(t+w)/2; if(judge(mid)) bao=mid,t=mid+1; else w=mid-1; } cout< 算法:二分答案#



