任务安排问题
某个系统中有一个设备,该设备每次只能分配给一个任务使用,且只有当任务结束后才能再分配给另一个任务使用。 假设系统启动时间计为时间0点,预先有一份任务计划表,预定了每个任务的开始时间点和持续时间。 要求设计算法统计出该设备最多能够满足任务计划表中的多少个任务的使用请求。
贪心结束时间最早的任务
struct node{
int start,duration,end;
};
bool cmp(node &a,node &b){
if(a.end==b.end)return a.start<b.start;
return a.end<b.end;
}
signed main(){
cf{
int n;cin>>n;
node a[n];
fer(i,0,n){
cin>>a[i].start>>a[i].duration;
a[i].end=a[i].start+a[i].duration;
}
sort(a,a+n,cmp);
int cnt=1,nowend=a[0].end;
fer(i,1,n){
if(a[i].start>=nowend){
cnt++;nowend=a[i].end;
}
}
cout<<cnt<<endl;
}
return 0;
}
活动安排
struct node{
int start,end;
};
bool cmp(node &a,node &b){
if(a.end==b.end)return a.start<b.start;
return a.end<b.end;
}
signed main(){
int n;cin>>n;
node a[n];
fer(i,0,n){
cin>>a[i].start>>a[i].end;
}
sort(a,a+n,cmp);
int cnt=1,nowend=a[0].end;
fer(i,1,n){
if(a[i].start>=nowend){
cnt++;nowend=a[i].end;
}
}
cout<<cnt<<endl;
return 0;
}
数列极差
小源的老师在黑板上写了一个由n个正整数组成的数列,要求小源进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数 a*b+1,如此下去直至黑板上剩下一个数为止。
在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为 M=max-min.
由于小源忙于准备期末考试,现请你帮助她,对于给定的数列,计算出相应的极差M。
max贪心升序队列,min贪心降序队列
signed main(){
int n;cin>>n;
int x;
priority_queue<int,vector<int>,greater<int> > up;//升序优先队列
priority_queue<int,vector<int>,less<int> > down;//降序优先队列
fer(i,0,n){
cin>>x;up.push(x);down.push(x);
}
char zero;cin>>zero;
int a,b;
while(up.size()>1){
a=up.top();up.pop();
b=up.top();up.pop();
up.push(a*b+1);
}
while(down.size()>1){
a=down.top();down.pop();
b=down.top();down.pop();
down.push(a*b+1);
}
cout<<up.top()-down.top()<<endl;
return 0;
}
钓鱼
在一条水平路边,有n个钓鱼湖,从左到右编号为1,2,…,n。庄dalao有H个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从1出发,向右走,有选择的在一些湖边停留一定的时间(是5分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。庄dalao从第i个湖到第i+1个湖需要走5×T i 分钟路,还测出在第i个湖停留,第一个5分钟可以钓到F i 条鱼,以后每再钓5分钟,可以钓到的鱼量减少D
i ,若减少后的鱼量小于0,则减少后的鱼量为0。为了简化问题,庄dalao假定没有其他人钓鱼,也没有其他因素影响他钓到期望数量的鱼。请编程求出庄dalao最多能钓鱼的数量。
第一行一个整数n,表示湖的个数,不大于25 第二行一个整数H,表示庄dalao的空闲时间,不大于20
第三行有n个整数,依次表示每个湖第一个5分钟能钓到鱼的数量 ,不大于100
第四行有n个整数,依次表示以后的每5分钟钓鱼数量比前一个5分钟钓鱼数量减少的数量 第五行有n-1个整数,T i
表示由第i个湖到第i+1个湖需要花5×T i 分钟的路程 保证在int以内
3
1
4 5 6
1 2 1
1 2
35
struct node{
int fish,reduce,time;
bool operator<( const node& y) const
{ return fish < y.fish; }
};
signed main(){
int n;cin>>n;
int h;cin>>h;
node lake[n];
fer(i,0,n)cin>>lake[i].fish;
fer(i,0,n)cin>>lake[i].reduce;
fer(i,1,n)cin>>lake[i].time;
int mx=0;
fer(i,0,n){//枚举最远可以到达的湖
int residue=h*12; //5分钟为一个单位
fer(j,1,i+1)residue-=lake[j].time;//去掉走路的时间
if(residue<=0)break;
int total=0;
priority_queue<node,vector<node>,less<node> > pq;//降序优先队列
fer(j,0,i+1)pq.push(lake[j]);
while(residue>0&&pq.top().fish>0){
node tmp=pq.top();pq.pop();
total+=tmp.fish;
residue--;
tmp.fish-=tmp.reduce;
if(tmp.fish>0)pq.push(tmp);//没鱼了就不用钓了
}
mx=max(mx,total);
}
cout<<mx<<endl;
return 0;
}