P2240
这根本不是背包,就设计一个结构体,然后排序,然后就比较一下减过之后的体积,然后按照不够的话,就单价乘以数量的思想
#include<iostream>
#include<algorithm>
using namespace std;
struct TR
{
double w,v;
}tr[105];
bool cmp(struct TR x,struct TR y)
{
return x.v /x.w >y.v /y.w ;
}
int a[105];
int main()
{
int N,T;
double ans=0,weight=0,mp=0;
cin>>N>>T;
for(int i=1;i<=N;i++)
{
cin>>tr[i].w >>tr[i].v ;
}
sort(tr+1,tr+N+1,cmp);
for(int i=1;i<=N;i++)
{
if(tr[i].w <=T)
{
T-=tr[i].w ;
ans+=tr[i].v ;
}
else
{
ans+=T*(tr[i].v /tr[i].w );
break;
}
}
printf("%.2f",ans);
return 0;
}
P1803
按照比赛结束时间排序
结束时间结束时间!!!!因为其实开始时间没有什么重要的,就是用来比较
#include<iostream>
#include<algorithm>
using namespace std;
struct Node
{
int st;
int end;
}a[100007];
bool cmp(struct Node x,struct Node y)
{
return x.end<y.end ;
}
int main()
{
int m,cur,cont=1;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i].st >>a[i].end ;
}
sort(a+1,a+m+1,cmp);
cur=a[1].end ;
for(int i=1;i<=m;i++)
{
if(a[i+1].st >=cur )
{
cont++;
cur=a[i+1].end;
}
}
cout<<cont;
return 0;
}
P1090
夸夸优先队列,是以堆为内层结构的,greater<int>是从小到大,所以每一次取出来top,然后pop,这样子两次过后,就是最小的两个,相加再插进去,然后这个优先队列就会自动排序,循环m-1就好了
#include<iostream>
#include<queue>
using namespace std;
int a[10086];
priority_queue<int ,vector<int>,greater<int> >qu;
int main()
{
int m,x,y,ans=0;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
qu.push(a[i]);
}
for(int i=1;i<=m-1;i++)
{
x=qu.top();
qu.pop();
x+=qu.top();
ans+=x;
qu.pop();
qu.push(x);
}
cout<<ans;
}
P1208
就当成一个模板,存在这里吧
#include<iostream>break!!!!
#include<algorithm>
using namespace std;
struct Niu
{
int dan;
int nai;
}a[1000089];
bool cmp(struct Niu x,struct Niu y)
{
return x.dan <y.dan ;
}
int main()
{
int xu,ti,ans=0;
cin>>xu>>ti;
for(int i=1;i<=ti;i++)
{
cin>>a[i].dan >>a[i].nai ;
}
sort(a+1,a+ti+1,cmp);
for(int i=1;i<=ti;i++)
{
if(xu>=a[i].nai )
{
xu-=a[i].nai;
ans+=a[i].dan *a[i].nai ;
}
else
{
ans+=a[i].dan*xu;
break;
}
}
cout<<ans;
return 0;
}
P1094
这个还是要想一想的,需要两个指针,一头一尾,看他们相加是否满足
#include<iostream>
#include<algorithm>
using namespace std;
int a[100000];
int main()
{
int mon,ge;
cin>>mon>>ge;
int end=ge,st=1,cont=0;
for(int i=1;i<=ge;i++)
{
cin>>a[i];
}
sort(a+1,a+ge+1);
while(st<=end)
{
if(a[end]+a[st]<=mon)
{
cont++;
end--;
st++;
}
else
{
cont++;
end--;
}
}
cout<<cont;
}