1. 程式人生 > >NYOJ 236--心急的C小加

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