• 贪心算法(兼容任务、均等笔)


    Markdown在线编辑器 - www.MdEditor.com

    4 兼容任务 (100)

    有n个任务,其中每个任务有一个起始时间si和一个结束时间ei,且si<ei,同一时间只能完成一个任务。如果选择了任务i ,则它在时间区间 [si ,ei) 内占用资源。若区间 [si ,ei) 与区间 [sj, ej)不相交,则称任务 i 与任务 j 是相容的。那么,对于给定的任务时间区间,能互相兼容的最大任务个数是多少呢?

    输入格式:

    第一行一个整数n (1<=n<=1000) ;
    接下来n行,每行两个整数si 和 ei。

    输出格式:

    互相兼容的最大任务个数。

    输入样例:

    4
    1 3
    4 6
    2 5
    1 7

    输出样例:

    2

    Accepted

    #include<stdio.h>
    struct task{
    	int a;
    	int b;
    };
    int main(){
    	int x,sum=1;
    	scanf("%d",&x);
    	struct task n[x],c;
    	for(int i=0;i<x;i++){
    		scanf("%d %d",&n[i].a,&n[i].b);
    	}
    	for(int i=0;i<x-1;i++){
    		for(int j=i+1;j<x;j++){
    			if(n[i].b>n[j].b)
    			{
    				c=n[i];
    				n[i]=n[j];
    				n[j]=c;
    			}
    		}
    	}
    	for(int i=1;i<x;i++){
    		if(n[0].b<=n[i].a){
    			sum+=1;
    			n[0].b=n[i].b;
    		}
    	}
    	printf("%d",sum);
    	return 0;
    }
    

    这道题的算法用贪心算法(贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止)。
    大佬解释:

    Markdown在线编辑器 - www.MdEditor.com

    贪心算法

    下面一道也是:

    Markdown在线编辑器 - www.MdEditor.com

    7 均等笔 (100分)

    n个人围成一圈,每人有ai支笔。每人可以向左右相邻的人传递笔,每人每次传递一支笔消耗的能量为1。求使所有人获得均等数量的笔的最小能量。

    输入格式:

    第一行一个整数n ,表示人的个数(30%的数据,n<=1000;100%的数据,n<=1e6)。
    接下来n行,每行一个整数 ai。

    输出格式:

    输出一个整数,表示使所有人获得均等笔的最小能量。(答案保证可以用64位有符号整数存储)

    输入样例:

    4
    1
    2
    5
    4

    输出样例:

    4

    Accepted

    #include<stdio.h>
    #include<stdlib.h> 
    #include<algorithm>
    using namespace std;
    int main(){
    	int n,i,j,k;
    	long long ave=0,sum=0,max=0;
    	scanf("%d",&n);
    	int a[n],x[n]={0};
    	for(i=0;i<n;i++){
    		scanf("%lld",&a[i]);
    		sum+=a[i];
    	}
    	ave=sum/n;/先求出平均值。
    	for(i=1;i<n;i++){
    		x[i]=ave-a[i-1]+x[i-1];
    	}
    	sort(x,x+n); 
    	j=n/2;
    	for(i=0;i<n;i++){
    		max+=abs(x[j]-x[i]);
    	}
    	printf("%lld",max);
    	return 0;
    }
    
    Markdown在线编辑器 - www.MdEditor.com

    我们用ai表示第i个小朋友手上拥有的糖果、xi表示第i个小朋友给第i−1个小朋友的糖果数,其中x1表示第1个小朋友给第n个朋友的糖果数,那么最终答案即为(|x1|+|x2|+…|xn|)。
    我们假设最后每个人剩avg个糖果,那么可以得到:
    对于第一个小朋友:a1+x2−x1=avg
    对于第二个小朋友:a2+x3−x2=avg

    对于最后一个小朋友:an+x1−xn=avg
    整理一下即可得到:
    x2=(avg−a1)+x1
    x3=(avg−a2)+x2=2avg+x1−a2−a1

    xn=(avg−an−1)+xn−1=(n−1)avg+x1−∑n−1i=1ai
    我们设c[1]=(a[1])-ave
    c[2]=c[1]+a[2]-ave=(a[1]+a[2])-2*ave
    则有(c[i]=c[i-1]+a[i]-ave=(a[1]+…+a[i])-i*ave)
    上述式子即可转化为求解(|x1|+|x1−c1|+|x1−c2|…+|x1−cn−1|)的最小值,那么直接令x1等于c的中位数即可。

    Markdown在线编辑器 - www.MdEditor.com

    引用出处

  • 相关阅读:
    CSS命名法
    CSS伪类
    CSS总结
    CSS应用给网页元素的几种方式总结
    CSS语法小记
    细谈WEB标准
    Spark 个人实战系列(1)--Spark 集群安装
    HBase 实战(1)--HBase的数据导入方式
    shell 脚本实战笔记(9)--linux自动批量添加用户
    shell 脚本实战笔记(8)--ssh免密码输入执行命令
  • 原文地址:https://www.cnblogs.com/czl411/p/12605835.html
Copyright © 2020-2023  润新知