rt,两种写法有何区别?
第一种(82分):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,k;
ll ans;
struct node
{
ll a,b,c;
}ice[N];
bool cmp(node x,node y)
{
return x.c<y.c;
}
int main()
{
freopen("icecream.in","r",stdin);
freopen("icecream.out","w",stdout);
scanf("%lld%lld",&n,&k);
ll sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&ice[i].a,&ice[i].b,&ice[i].c);
sum1+=ice[i].a;
sum2+=ice[i].b;
ans+=1ll*ice[i].c*ice[i].a;
}
if(k<sum1||k>sum2)
{
puts("-1");
return 0;
}
sort(ice+1,ice+n+1,cmp);
k-=sum1;
for(int i=1;i<=n;i++)
{
if(k>=(ice[i].b-ice[i].a))
{
ans+=1ll*(ice[i].b-ice[i].a)*ice[i].c;
k-=(ice[i].b-ice[i].a);
}
else
{
ans+=1ll*k*ice[i].c;
printf("%lld\n",ans);
return 0;
}
}
return 0;
}
第二种(100分):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,k;
ll ans;
struct node
{
ll a,b,c;
}ice[N];
bool cmp(node x,node y)
{
return x.c<y.c;
}
int main()
{
freopen("icecream.in","r",stdin);
freopen("icecream.out","w",stdout);
scanf("%lld%lld",&n,&k);
ll sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&ice[i].a,&ice[i].b,&ice[i].c);
sum1+=ice[i].a;
sum2+=ice[i].b;
ans+=1ll*ice[i].c*ice[i].a;
}
if(k<sum1||k>sum2)
{
puts("-1");
return 0;
}
sort(ice+1,ice+n+1,cmp);
k-=sum1;
for(int i=1;i<=n;i++)
{
if(k>=(ice[i].b-ice[i].a))
{
ans+=1ll*(ice[i].b-ice[i].a)*ice[i].c;
k-=(ice[i].b-ice[i].a);
}
else
{
ans+=1ll*k*ice[i].c;
break;
}
}
printf("%lld\n",ans);
return 0;
}