描述
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?
输入
第一行是一个整数T(1<T<1500),表示输入数据一共有T组。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。
输出
处理这些木棒的最短时间。
样例输入
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
样例输出
2
1
3
题意
贪心,把木棒按照l从小到大排列,l相同的按照w排列,然后遍历N次,每一次从最前面未处理过的的地方开始遍历 ,处理掉所有符合l和w都比之前的大的木棒,每次count++
AC-Code
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Wood implements Comparable<Wood>{
private int l;
private int w;
private int f;
public int getF() {
return f;
}
public void setF(int f) {
this.f = f;
}
public int getL() {
return l;
}
public void setL(int l) {
this.l = l;
}
public int getW() {
return w;
}
public void setW(int w) {
this.w = w;
}
public int compareTo(Wood o) {
if(this.l>o.l)
{
return 1;
}
else if(this.l==o.l&&this.w>o.w)
{
return 1;
}
return -1;
}
}
public class ACM236 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t-->0) {
int n = sc.nextInt();
ArrayList<Wood> list = new ArrayList<Wood>();
for(int i= 0;i<n;i++)
{
Wood obj = new Wood();
obj.setL(sc.nextInt());
obj.setW(sc.nextInt());
obj.setF(0);
list.add(obj);
}
Collections.sort(list);
int count = 0;
for(int i =0;i<list.size();i++){
if(list.get(i).getF()==0)
{
count++;
int last = list.get(i).getW();
for(int j=i+1;j<list.size();j++)
{
if(list.get(j).getF()==0&&list.get(j).getW()>=last){
list.get(j).setF(1);
last = list.get(j).getW();
}
}
}
}
System.out.println(count);
}
sc.close();
}
}
感悟:使用java中的集合有多种遍历方式,而最基本的遍历方式为:for(int i =0;i<list.size();i++)
此方式可以使用多重循环,而增强for只能使用在单个循环;对对象数据的遍历和操作。而且在竞赛中为了减小程序的运行时间,应使用普通方式遍历,尽量少使用迭代器和增强for来遍历集合
Java中list的遍历方式:
java.util.List<String> list = new java.util.ArrayLust<String>();
list.add("a");
list.add("b");
//方式一:使用java.util.Iterator容器迭代。
java.util.Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//方式二:使用foreach进行遍历。
for(String str : list){
System.out.println(str);
}
//方式三:使用for循环进行遍历。
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
//方式四:转换为数组进行遍历。
String[] arr = new String[list.size()];
arr = list.toArray();