社区讨论

灵异事件求解

P4086[USACO17DEC] My Cow Ate My Homework S参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mk2kyiis
此快照首次捕获于
2026/01/06 20:43
上个月
此快照最后确认于
2026/01/10 09:55
上个月
查看原帖
以下是我这题的代码(使用后缀和)
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[100010],suc[100010],mn[100010],ans;
float mx;
signed main(){
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    for (int i=n;i>=1;i--) suc[i]=suc[i+1]+a[i];
    memset(mn,0x3f3f3f,sizeof(mn));
    for (int i=n;i>=1;i--) mn[i]=min(mn[i+1],a[i]);
    for (int i=1;i<=n-2;i++){
        if ((suc[i+1]-mn[i+1])*1.0/(n-i-1)>mx){
            mx=(suc[i+1]-mn[i+1])*1.0/(n-i-1);
            ans=i;
        } 
    }
    for (int i=1;i<=n-2;i++){
        if ((suc[i+1]-mn[i+1])*1.0/(n-i-1)==mx){
            cout<<i<<endl;
        } 
    } 
    return 0;
}
然而挂成了 20 pts。
于是我下载了这题第二个数据(答案是 20),然后在 20 时输出。
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[100010],suc[100010],mn[100010],ans;
float mx;
signed main(){
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    for (int i=n;i>=1;i--) suc[i]=suc[i+1]+a[i];
    memset(mn,0x3f3f3f,sizeof(mn));
    for (int i=n;i>=1;i--) mn[i]=min(mn[i+1],a[i]);
    for (int i=1;i<=n-2;i++){
        if ((suc[i+1]-mn[i+1])*1.0/(n-i-1)>mx){
            mx=(suc[i+1]-mn[i+1])*1.0/(n-i-1);
            ans=i;
        } 
    }
    for (int i=1;i<=n-2;i++){
        if ((suc[i+1]-mn[i+1])*1.0/(n-i-1)==mx){
            cout<<i<<endl;
        } 
        if (i==20){
            cout<<(suc[i+1]-mn[i+1])*1.0/(n-i-1)<<" "<<mx<<endl;
        }
    } 
    return 0;
}
输出:248.345 248.345
但是前面竟然没输出 20!
不是哥们,248.345 难道不和 248.345 相同吗?!
于是我将第 5 行的 float 改成 double:
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[100010],suc[100010],mn[100010],ans;
double mx;
signed main(){
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    for (int i=n;i>=1;i--) suc[i]=suc[i+1]+a[i];
    memset(mn,0x3f3f3f,sizeof(mn));
    for (int i=n;i>=1;i--) mn[i]=min(mn[i+1],a[i]);
    for (int i=1;i<=n-2;i++){
        if ((suc[i+1]-mn[i+1])*1.0/(n-i-1)>mx){
            mx=(suc[i+1]-mn[i+1])*1.0/(n-i-1);
            ans=i;
        } 
    }
    for (int i=1;i<=n-2;i++){
        if ((suc[i+1]-mn[i+1])*1.0/(n-i-1)==mx){
            cout<<i<<endl;
        } 
        if (i==20){
            cout<<(suc[i+1]-mn[i+1])*1.0/(n-i-1)<<" "<<mx<<endl;
        }
    } 
    return 0;
}
A 了!
不是,这是什么灵异事件,求大佬解答
悬 1 关

回复

3 条回复,欢迎继续交流。

正在加载回复...