麻了,又开始fastfoces了。 更可气的是B差一点就ac了,如果再多给我几分钟那我就直接起飞了,可是并没有,所以我坠落了。。。
题意:
有条线段,用c价格的钱可以买下l到r之间的整数,给出n组数据,输出能得到最多整数的情况需要的花费,如果有相同整数的情况则输出花费较小的值,同一个整数只能获取一次。
分析:
剪两次,中间的会被当做礼物赠送。答案最多是剪两次的情况,一次剪r最大的时候,一次剪l最小的时候,剩下的中间部分会直接赠送给我们,然后我们找到价格最小同时又能覆盖到最小的l到最大的r部分的情况就是答案。
代码:
我用的是贪心+分类讨论,代码极繁琐,肯定有大佬的要比我的简单很多。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// #define endl '\n';
int main()
{
ll n,t,i,j;
cin>>t;
while(t--)
{
cin>>n;
ll l,r,c;
ll sum=0;
ll lmin,rmax;
ll fuzhu1,fuzhu2;//l最小并且花费最少的值,r最大并且花费最少的值
cin>>l>>r>>c;
fuzhu1=c,fuzhu2=c;
sum=c;
lmin=l;
rmax=r;
cout<<sum<<endl; //第一组数据答案就是第一个
for(i=1; i<n; i++)
{
cin>>l>>r>>c;
if(l<lmin&&r>rmax) //如果l是最小的r是最大的那么它本身
//就可以取到最多的整数,这就是答案
{
lmin=l;
rmax=r;
fuzhu1=c,fuzhu2=c;
sum=c;
cout<<sum<<endl;
continue;
}
if(l<lmin&&r==rmax)
//这也同样是答案,但是我们要为后面的数据做准备,递推算出最大的r中需要花费最少的情况
{
lmin=l;
rmax=r;
fuzhu1=c; //l是最小的,左边就是最好的情况
fuzhu2=min(c,fuzhu2);
sum=c;
cout<<sum<<endl;
continue;
}
if(l==lmin&&r>rmax)
{
lmin=l;
rmax=r;
fuzhu1=min(c,fuzhu1);//递推算出最小的l中需要花费最少的情况
fuzhu2=c; //r是最大的,右边就是最好的情况
sum=c;
cout<<sum<<endl;
continue;
}
if(l<lmin&&r<rmax)
//虽然l最小但是r不是最大的,我们要找到r最大的并且花费最少的情况,前面已经递推出来了
{
lmin=l;
fuzhu1=c;
sum=c+fuzhu2;
cout<<sum<<endl;
continue;
}
if(l>lmin&&r>rmax) //和上一个if同理
{
rmax=r;
fuzhu2=c;
sum=c+fuzhu1;
cout<<sum<<endl;
continue;
}
if(l>lmin&&r<rmax)
//l不是最小,r不是最大,这不符合我们的贪心策略,中间的部分我们只要让它成为礼物就行了
{
cout<<sum<<endl;
continue;
}
if(l==lmin&&r<rmax)
//这种情况可能会改变最小l花费的最小值,需要递推一下
{
fuzhu1=min(fuzhu1,c);
sum=min(sum,c+fuzhu2);
cout<<sum<<endl;
continue;
}
if(l>lmin&&r==rmax)//和上一个if同理,更改的是最大的r的情况
{
fuzhu2=min(fuzhu2,c);
sum=min(sum,c+fuzhu1);
cout<<sum<<endl;
continue;
}
if(l==lmin&&r==rmax)
{
fuzhu1=min(fuzhu1,c);
fuzhu2=min(fuzhu2,c);
sum=min(sum,c);
cout<<sum<<endl;
continue;
}
}
}
}
连续六次cf掉分,有没有大佬给点建议救一下菜鸟