第一个点RE的看过来
查看原帖
第一个点RE的看过来
418681
anewbg楼主2021/10/22 08:23

啊,蒟蒻自己做时发现第一个点死活改不了,才发现用while判断会有T大于sum(mi) 的问题。

所以要在循环时判断是否到头的呢death

下面是80分代码与100分代码比较:

(找不同吧)

80分:

#include<bits/stdc++.h>
using namespace std;

const int maxn=105;
int n,cnt;
double t,ans;
struct aaa
{
    double v,w,x;
    bool operator < (const aaa &q) const {return q.x<x;}
}a[maxn];

int main()
{
    cin>>n>>t;
    for(int i=1;i<=n;++i)
        cin>>a[i].v>>a[i].w,a[i].x=a[i].w/a[i].v;
    sort(a+1,a+1+n);
    while(t>a[++cnt].v)
    {
        t-=a[cnt].v;
        ans+=a[cnt].w;
    }
    ans+=a[cnt].x*t;
    printf("%.2f",ans);
    return 0;
}

100分:

#include<bits/stdc++.h>
using namespace std;

const int maxn=105;
int n,cnt;
double t,ans;
struct aaa
{
	double v,w,x;
    bool operator < (const aaa &q) const {return q.x<x;}
}a[maxn];

int main()
{
    cin>>n>>t;
    for(int i=1;i<=n;++i)
        cin>>a[i].v>>a[i].w,a[i].x=a[i].w/a[i].v;
    sort(a+1,a+1+n);
    while(t>=a[++cnt].v&&cnt<=n)
    {
        t-=a[cnt].v;
        ans+=a[cnt].w;
    }
    if(t>0)
    {
    	if(cnt<=n)
    		ans+=a[cnt].x*t;
	}
    printf("%.2f",ans);
    return 0;
}
2021/10/22 08:23
加载中...