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);
}
}