cout要输出(int)(ans*1000+0.1)!!! 别问为啥!!问就是实践出真知
这是我最初的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define eps 1e-6
#define int long long
const int N=1e5+10;
int n,m,a[N];
bool check(double f){
double s[N],v[N];
for(int i=1;i<=n;i++)
s[i]=s[i-1]+1.0*a[i]-f;
double minn=1e9,ans=-1;
for(int i=m;i<=n;i++){
minn=min(minn,s[i-m]);
ans=max(ans,s[i]-minn);
}
return ans>=0;
}
signed main(){
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
double l=0,r=2e8;
while(r-l>eps){
double mid=(l+r)/2.0;
if(check(mid))
l=mid;
else
r=mid;
}
printf("%.0lf",l*1000);
return 0;
}
然而,92分,我就尝试改成cin,cout
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define eps 1e-6
#define int long long
const int N=1e5+10;
int n,m,a[N];
bool check(double f){
double s[N],v[N];
for(int i=1;i<=n;i++)
s[i]=s[i-1]+1.0*a[i]-f;
double minn=1e9,ans=-1;
for(int i=m;i<=n;i++){
minn=min(minn,s[i-m]);
ans=max(ans,s[i]-minn);
}
return ans>=0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
double l=0,r=2e8;
while(r-l>eps){
double mid=(l+r)/2.0;
if(check(mid))
l=mid;
else
r=mid;
}
cout<<(int)(l*1000);
return 0;
}
结果就只有36分了,所以我翻了翻讨论版,然后……
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define eps 1e-6
#define int long long
const int N=1e5+10;
int n,m,a[N];
bool check(double f){
double s[N],v[N];
for(int i=1;i<=n;i++)
s[i]=s[i-1]+1.0*a[i]-f;
double minn=1e9,ans=-1;
for(int i=m;i<=n;i++){
minn=min(minn,s[i-m]);
ans=max(ans,s[i]-minn);
}
return ans>=0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
double l=0,r=2e8;
while(r-l>eps){
double mid=(l+r)/2.0;
if(check(mid))
l=mid;
else
r=mid;
}
cout<<(int)(l*1000+0.1);
return 0;
}
就AC了
所以,重要的事情说三遍 cout要输出(int)(ans1000+0.1)!!! cout要输出(int)(ans1000+0.1)!!! cout要输出(int)(ans*1000+0.1)!!! 希望能别帮助你