贪心策略:选择每一次的最佳方案;
智力大冲浪:
题目大意:比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti时时间段之前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。 当然,每个游戏本身都很简单,保证每个参赛者都能在一个时间段(要占一个单位时间)内完成,而且都必须从整时段开始。
思路:1.读入;2.按价格排序;3用bool数组判断能否完成;4.计算输出;
代码实现:
#include<bits/stdc++.h>
using namespace std;struct yx
{
int s;
int q;
}a[1000];
bool st1(yx x,yx y)
{
return x.q>y.q;
}
int main()
{
int n,i,b,d;bool c[1000]={},l=0;
cin>>b;cin>>n;
for(i=1;i<=n;i++) cin>>a[i].s;
for(i=1;i<=n;i++) cin>>a[i].q;
sort(a+1,a+n+1,st1);
or(i=1;i<=n;i++)
{
d=a[i].s;
while(d>=1)
{
if(c[d]==0)
{
c[d]=1;
l=1;
break;
}
d=d-1;
}
if(l==1) l=0;
else
{
l=0;
b=b-a[i].q;
}
}
cout<<b;
return 0;
}
修理牛棚:
题目大意: 他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。 农民约翰想将他购买的木板总长度减到最少。给出 M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。
思路:1.读入;2.寻找m-1个最大间隔;3.用全部覆盖的长度减去间隔(全部覆盖长度不等于s,等于第一头牛到最后一头牛的长度;4输出;
代码实现:#include<bits/stdc++.h>
using namespace std;
int main()
{
int x=0,y=0,z=0,a[210]={},b[210]={},c=0,d=0,i=0,h;
cin>>x>>y>>z;
if(x>=z)
{
cout<<z;
return 0;
}
c=0;d=0;i=0;
for(i=1;i<=z;i++)
{
cin>>a[i];
}
sort(a+1,a+z+1);
for(i=2;i<=z;i++)
{
b[i-1]=a[i]-a[i-1]-1;
}
sort(b+1,b+z);
for(i=z-1;i>z-x;i--)
{
c=c+b[i];
}
d=a[z]-a[1]+1;
h=d-c;
cout<<h;
return 0;
}
游荡的奶牛:
题目大意: 每只牛只喜欢在某个特定的范围内吃草。第i头牛喜欢在区间(S_i, E_i)吃草, (1 <= S_i < E_i; S_i < E_i<= 100,000,000).如果奶牛i和奶牛j想要同时吃草,那么要满足: S_i >= E_j 或者 E_i <= S_j. FJ想知道在同一时刻,最多可以有多少头奶牛同时吃草?
思路:1.读入;2.排序(标准为右端点位置从小到大);3.比较相邻两个线段看是否重合,未重合条数加一,并把当前线段变为后一条线段,若重合,不做变动;4.输出;
代码实现:
#include<bits/stdc++.h>
using namespace std;
struct n
{
int l;
int r;
}d[50001];
bool hh(n x,n y)
{
return x.r<y.r;
}
int main()
{
int i,x=0,y=1,z=1;
cin>>x;
for(i=1;i<=x;i++)
{
cin>>d[i].l>>d[i].r;
}
sort(d+1,d+1+x,hh);
for(i=2;i<=x;i++)
{
if(d[y].r<=d[i].l)
{
y=i;
z=z+1;
}
}
cout<<z;
return 0;
}