NYOJ 236--心急的C小加

描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值