贪心问题

1.硬币问题

有1元、5元、10元、50元、100元、500元的硬币各c1、c5、c10、c50、c100、c500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?假定本题至少存在一种支付方案。

Input
一行c1、c5、c10、c50、c100、c500、A,中间用空格隔开。

Output
最少的硬币数量。

Sample Input
3 2 1 3 0 2 620
Sample Output
6

代码如下:

package Test1;

import java.util.Scanner;

public class L1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = { 1, 5, 10, 50, 100, 500 };
		Scanner sc = new Scanner(System.in);
		int[] c = new int[6];// 硬币的枚数
		for (int i = 0; i < c.length; i++) {
			c[i] = sc.nextInt();
		}
		int A = sc.nextInt();
		int ans = 0, t;
		for (int i = 5; i >= 0; i--) {
			t = Math.min(A / a[i], c[i]);
			A -= t * a[i];
			ans += t;
		}
		System.out.println(ans);
	}

}

 2.

问题主题:区间调度问题
问题描述:
有n项工作,每项工作分别在si开始,ti结束。对每项工作,你都可以选择参加或不参加,但选择了参加某项工作就必须至始至终参加全程参与,即参与工作的时间段不能有重叠(即使开始的时间和结束的时间重叠都不行)。
限制条件:
1<=n<=100000
1<=si<=ti,=109
样例:
输入
n=5
s={1,2,4,6,8}
T={3,5,7,9,10}
输出
3(选择工作1, 3, 5)

代码如下:

package Test1;

import java.util.Arrays;
import java.util.Scanner;

public class L2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		Job[] a=new Job[n];
		for (int i = 0; i < n; i++) {
			a[i]=new Job();
			a[i].s=sc.nextInt();
		}
		for (int i = 0; i < n; i++) {
			a[i].t=sc.nextInt();
		}
		Arrays.sort(a);
		int ans=0,t=0;
		for (int i = 0; i < n; i++) {
			if(t<a[i].s) {
				ans++;
				t=a[i].t;
			}
		}
		System.out.println(ans);
	}

}
class Job implements Comparable<Job>{
	int s,t;

	@Override
	public int compareTo(Job o) {
		// TODO Auto-generated method stub
		if(t<o.t)
			return -1;
		else
			return 1;
	}
}

3.字典序最小问题

1>从S的头部删除一个字符,加到T的尾部; 
2>从S的尾部删除一个字符,加到T的尾部。

目标是要构造字典序尽可能小的字符串T。

比如当N=6,S=”ACDBCB”时,程序应输出ABCBCD。

代码如下:

package Test1;

import java.util.Scanner;

public class L3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		String s=sc.next();
		String t="";
		int a=0,b=n-1;
		while(a<=b) {
			boolean left=false;
			if(s.charAt(a)<s.charAt(b))
				left=true;
			else
				left=false;
			if(left)
				t+=s.charAt(a++);
			else
				t+=s.charAt(b--);
		}
		System.out.println(t);
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值