转载改编自:
https://blog.csdn.net/qq_32400847/article/details/51336300#
来源:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1298.html 山东理工OJ 1298
#include
#include
using namespace std;
///结构体存储事件的属性
struct node
{
int start; ///事件的开始时间
int end; ///事件的结束时间
int select; ///标记是否选择该事件
int id; ///事件的id
}a[100],temp;
bool cmp(node &m,node &n)
{
return m.end<n.end;
}
int main()
{
int n;
int i,j;
int s = 0; ///用于标记上一次事件结束的事件
///输入n个事件
scanf("%d",&n);
for( i = 0; i < n; i++ )
{
scanf("%d%d",&a[i].start,&a[i].end);
a[i].id = i + 1; ///每一个事件的id赋值
a[i].select = 0; ///默认事件的选择状态为0(不选择)
}
sort(a,a+n,cmp);
///进行事件的选择
for( i = 0; i < n; i++ )
{
///如果当前事件的开始时间在上一个选择事件之后
///则选择当前事件
if( a[i].start >= s )
{
a[i].select = 1; ///选择标记改为1(选中)
s = a[i].end; ///记录当前事件的结束时间
}
}
///输出结果
printf("%d",a[0].id);
for( i = 1; i < n; i++ )
{
if( a[i].select == 1 )
printf(",%d",a[i].id);
}
printf("\n");
return 0;
}
这个问题在日常生活中很普遍。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?
用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。
#include
#include
using namespace std;
const int N=7;
int Count[N]={6,6,6,6,6,6};//每一张纸币的数量
int Value[N]={1,2,5,10,20,50,100};//每一张的面额
int solve(int money)
{
int num=0;
for(int i=N-1;i>=0;i--)
{
int c=min(money/Value[i],Count[i]);//每一个所需要的张数
money=money-c*Value[i];
num+=c;//总张数
}
if(money>0) num=-1;
return num;
}
int main()
{
int money;
cin>>money;
int res=solve(money);
if(res!=-1) cout<<res<<endl;
else cout<<"NO"<<endl;
}
#include
using namespace std;
const int N=4;
void knapsack(float M,float v[],float w[],float x[]);
int main()
{
float M=50;
//背包所能容纳的重量
float w[]={0,10,30,20,5};
//每种物品的重量
float v[]={0,200,400,100,10};
//每种物品的价值
float x[N+1]={0};
//记录结果的数组
knapsack(M,v,w,x);
cout<<"选择装下的物品比例:"<<endl;
for(int i=1;i<=N;i++) cout<<"["<<i<<"]:"<<x[i]<<endl;
}
void knapsack(float M,float v[],float w[],float x[])
{
int i;
//物品整件被装下
for(i=1;i<=N;i++)
{
if(w[i]>M) break;
x[i]=1;
M-=w[i];
}
//物品部分被装下
if(i<=N) x[i]=M/w[i];
}
哪个花费的时间短一目了然(图不准确,大概表示一下)
如果我们每次是将需要处理时间最短的作业分配给空闲的机器,那么可能就会出现其它所有作业都处理完了,只剩所需时间最长的作业在处理的情况,这样势必效率较低。
在下面示范代码中没有讨论n和m的大小关系,把这两种情况合二为一进行。
#include
#include
using namespace std;
int speed[10010];
int mintime[110];
bool cmp( const int &x,const int &y)
{
return x>y;
}
int main()
{
int n,m;
memset(speed,0,sizeof(speed));
memset(mintime,0,sizeof(mintime));
cin>>n>>m;
for(int i=0;i<n;++i) cin>>speed[i];
sort(speed,speed+n,cmp);
for(int i=0;i<n;++i)
{
//这一部非常巧妙,mintime存储着机器完成作业的剩余时间
//其中值最小的,就会是最快完成接下来作业的机器
//那么就再给他分配下一个任务
*min_element(mintime,mintime+m)+=speed[i];
}
cout<<*max_element(mintime,mintime+m)<<endl;
}
#include
#include
using namespace std;
int main()
{
int a[1000],t,n,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
while(n>3)
{
sum=min(sum+a[1]+a[0]+a[n-1]+a[1],sum+a[n-1]+a[0]+a[n-2]+a[0]);
n-=2;
}
if(n==3) sum+=a[0]+a[1]+a[2];
else if(n==2) sum+=a[1];
else sum+=a[0];
printf("%d\n",sum);
}
}
#include
#include
#include
#include
using namespace std;
struct Interval{
double lf,rg;
}interval[1004];
bool cmp(Interval &a,Interval &b)
{
return a.lf<b.lf;
}
//思路:把海岛的位置映射到线段上,然后再合并重叠区间,找到剩下多少个区间
int main()
{
int n,d,T = 0,flag;
//freopen("poj 1382.txt","r",stdin);
while(scanf("%d%d",&n,&d),n+d)
{
double x,y;flag = 0;
for(int i = 0;i < n;++i)
{
scanf("%lf%lf",&x,&y);
if(y>d) flag = 1;
interval[i].lf = x-sqrt(d*d-y*y);
interval[i].rg = x+sqrt(d*d-y*y);
}
if(flag) {printf("Case %d: %d\n",++T,-1);continue;}
sort(interval,interval+n,cmp);
int ans = 0;
for(int i = 0;i < n-1;++i)
{
if(interval[i+1].lf<=interval[i].rg)//出现了重叠
{
interval[i+1].rg = min(interval[i+1].rg,interval[i].rg);
}else
{
++ans;
}
}
printf("Case %d: %d\n",++T,ans+1);
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
using namespace std;
long long int price[100010],t,n,res;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n;
priority_queue<long long int, vector<long long int>, greater<long long int> > q;
res=0;
for(int i=1;i<=n;i++)
{
cin>>price[i];
}
res-=price[1];
res+=price[n];
for(int i=2;i<=n-1;i=i+2)
{
long long int buy=min(price[i],price[i+1]);
long long int sell=max(price[i],price[i+1]);
if(!q.empty())
{
if(buy>q.top())
{
res=res-2*q.top()+buy+sell;
q.pop();
q.push(buy);
q.push(sell);
}
else
{
res=res-buy+sell;
q.push(sell);
}
}
else
{
res=res-buy+sell;
q.push(sell);
}
}
cout<<res<<endl;
}
}
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(),courses.end(),[](vector<int>& src,vector<int>& des)
{
return src[1]<des[1];
});
int now = 0;
priority_queue<int> heap;
for(int i=0;i<courses.size();++i)
{
heap.push(courses[i][0]);
now+=courses[i][0];
if(now>courses[i][1])
{
now -= heap.top();
heap.pop();
}
}
return heap.size();
}
};