【2016-CCPC-C】二分,动脑筋(Car,hdu 5935)
2016-10-29 23:27
369 查看
比赛时看时间和路程都是整数,因此觉得速度也会是整数,因此走上了求因数的不归路。
后来才知道速度也可以是小数的。之所以会这样,只能说自己太浮躁吧。就像在用蛮力。其实自己做事可以细致一点,四两拨千斤。
后来看了别人说可以取小数,就用二分来求,然后超时。后来优化了下二分范围,然后就过了。936ms/1000ms。说明很多时候,像这种解法多样的题目,你可能会因为解法不够优秀而徘徊在超时的边缘,所以能优化下尽量优化下吧。优化了下输入输出811ms。
其实可以递推出答案的,用这一段的路程除以上一段的速度,就可以得到以上一段的速度通过这一段路程所需要的时间,时间可能是小数。因为时间必须是整数,而且速度只能增不能减,因此时间要向上取整。因为会有精度问题,所以可以用eps=1e-8处理或者用分数来表示。514ms。
二分代码
递推代码
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
int N;
int a[maxn];
int gcd(int a,int b)
{
if(a<b) swap(a,b);
return a%b==0?b:gcd(b,a%b);
}
int main()
{
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
int ans=1;
int fz=a
-a[N-1];
int fm=1;
for(int i=N-1;i>=1;i--)
{
int d=a[i]-a[i-1];
int FZ=d*fm;
int FM=fz;
int shijian;
if(FZ%FM==0) shijian=FZ/FM;
else shijian=FZ/FM+1;
ans+=shijian;
fz=a[i]-a[i-1];
fm=shijian;
int GCD=gcd(fz,fm);
fz/=GCD;
fm/=GCD;
}
printf("Case #%d: %d\n",t,ans);
}
return 0;
}
后来才知道速度也可以是小数的。之所以会这样,只能说自己太浮躁吧。就像在用蛮力。其实自己做事可以细致一点,四两拨千斤。
后来看了别人说可以取小数,就用二分来求,然后超时。后来优化了下二分范围,然后就过了。936ms/1000ms。说明很多时候,像这种解法多样的题目,你可能会因为解法不够优秀而徘徊在超时的边缘,所以能优化下尽量优化下吧。优化了下输入输出811ms。
其实可以递推出答案的,用这一段的路程除以上一段的速度,就可以得到以上一段的速度通过这一段路程所需要的时间,时间可能是小数。因为时间必须是整数,而且速度只能增不能减,因此时间要向上取整。因为会有精度问题,所以可以用eps=1e-8处理或者用分数来表示。514ms。
二分代码
#include<bits/stdc++.h> #define maxn 100010 using namespace std; int N; int a[maxn]; inline int readint() { char c=getchar(); while(!isdigit(c)) c=getchar(); int x=0; while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } return x; } inline void gt(int& x) { char ch; bool fu; x=0; while(ch=getchar(),!(isdigit(ch)||ch=='-')); if(ch=='-') { fu=true; ch=getchar(); } else fu=false; while(x*=10,x+=ch-'0',ch=getchar(),isdigit(ch)); if(fu) x=-x; } inline gcd(int a,int b) { if(a<b) swap(a,b); return a%b==0?b:gcd(b,a%b); } int main() { int T; T=readint(); for(int t=1;t<=T;t++) { N=readint(); for(int i=1;i<=N;i++) a[i]=readint(); int ans=1; int fz=a[N]-a[N-1]; int fm=1; for(int i=N-1;i>=1;i--) { int d=a[i]-a[i-1]; int FZ=d*fm; int FM=fz; int shijian; if(FZ%FM==0) shijian=FZ/FM; else shijian=FZ/FM+1; ans+=shijian; fz=a[i]-a[i-1]; fm=shijian; int GCD=gcd(fz,fm); fz/=GCD; fm/=GCD; } printf("Case #%d: %d\n",t,ans); } return 0; }
递推代码
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
int N;
int a[maxn];
int gcd(int a,int b)
{
if(a<b) swap(a,b);
return a%b==0?b:gcd(b,a%b);
}
int main()
{
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
int ans=1;
int fz=a
-a[N-1];
int fm=1;
for(int i=N-1;i>=1;i--)
{
int d=a[i]-a[i-1];
int FZ=d*fm;
int FM=fz;
int shijian;
if(FZ%FM==0) shijian=FZ/FM;
else shijian=FZ/FM+1;
ans+=shijian;
fz=a[i]-a[i-1];
fm=shijian;
int GCD=gcd(fz,fm);
fz/=GCD;
fm/=GCD;
}
printf("Case #%d: %d\n",t,ans);
}
return 0;
}
相关文章推荐
- 2016ccpc杭州赛 hdu 5935 C.Car
- HDU 5935 && 2016CCPC杭州 C: Car
- HDU-5935-Car(杭州CCPC C题)-数学推导+水贪心
- HDU 5943 && 2016CCPC杭州 K: Kingdom of Obsession(二分匹配)
- HDU-5832-A water problem【2016CCPC网络赛】
- hdu 5546 Ancient Go(2016ccpc) 暴力DFS
- HDU 5935 Car 【模拟】 (2016年中国大学生程序设计竞赛(杭州))
- HDU 5935 Car 贪心 倒推 分数
- hdu 5726, 2016多校1 - D,st表+二分
- (HDU 5927)Auxiliary Set 思维题 <2016CCPC东北地区大学生程序设计竞赛 - 重现赛 >
- HDU 5961 传递 图论 BFS (2016CCPC 合肥 A题)
- HDU-5835-Danganronpa【2016CCPC网络赛】
- HDU - 5933 ArcSoft's Office Rearrangement 模拟 (2016CCPC杭州
- HDU 5918 Sequence I (2016-ccpc-长春)
- HDU 5922 Minimum’s Revenge 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
- hdu 5929 Basic Data Structure 2016CCPC东北地区大学生程序设计竞赛
- hdu 5838 Mountain(2016 CCPC网络赛1007) 状压
- HDU-5842-Lweb and String【2016CCPC网络赛】
- HDU 5954 Do not pour out 积分 二分 — 2016ACM-ICPC亚洲区沈阳站
- HDU-5706-GirlCat【BFS】【2016CCPC女生专场】