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;
}
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;
}
P1223 排队接水
一个有用的技巧不用开结构体就是把时间放大很多倍,之后就可以直接排序了
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
double sum;
long int n;
long long int t[1001];
double ans;
int main(int argc, const char * argv[])
{
cin>>n;
int x;
for(int i=1;i<=n;i++)
{
cin>>x;
t[i]=x*10002+i;
}
sort(t+1,t+1+n);
for(int j=1;j<=n;j++)
{
cout<<t[j]%10002<<" ";
sum+=t[j]/10002*(n-j);
}
cout<<endl;
ans=sum/n;
printf("%0.2lf",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;
}
P1031
那么必定是从右到左一一地满足啊
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int m,a[10000],sum,aver,s=0;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
sum+=a[i];
}
aver=sum/m;
for(int i=1;i<m;i++)
{
if(a[i]!=aver)
{a[i+1]-=aver-a[i];
s++;
}
}
cout<<s;
}