1. 程式人生 > >HDU 1571/1572(Java版)

HDU 1571/1572(Java版)

下沙小面的(1)

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1429    Accepted Submission(s): 593

Problem Description

Lele 在下沙高校中有很多同學,所以他有時間也經常到處去看望同學(順便蹭飯)。
在下沙,最便宜方便的交通工具莫過於小面的了。
坐得多了,Lele有時候也想,如果將來失業了,能夠在下沙開開小面的,也是多麼幸福的啊。

終於有一天,他如願當上了小面的的司機。為了更好的服務客戶,他訂立了一些開車的法則。

1.當有人要求上車時,如果不是下面這兩種情況,他就會讓人上車。
2.有些人會因為迷路,往往不知道自己在哪裡。比如身在城市1,他也會要求Lele把他送到城市1。這時,Lele當然具有商人誠信的原則,告訴他這個情況,並且不會讓他上車。
3.由於小面的的座位只有7個(不包括司機Lele的駕駛座),如果當時車上已經有7個人,Lele就不會讓人再上車了。
4.在沒人上車時,Lele會看車內誰最早上車,然後把他送到目的地,當然,車內其他要去這個地方的人也會一起下車。然後車停在那個位置
5.如果車內已經沒乘客了,Lele就會在原地等著,直到下一個顧客上門。否則Lele在那個地方重複前面的法則。

現在,告訴你Lele一天面對到的情況,請幫他計算一下,他一天一共開了多少距離。

Input

本題目包含多組測試。最後一組測試後有一個0代表結束。
每組測試第一行有一個整數NCity(3<=NCity<=30)表示下沙一共有多少個站點(站點從0開始標號)。
然後給你一個 NCity * NCity 的矩陣,表示站點間的兩兩距離。即這個矩陣中第 i 行 第 j 列的元素表示站點 i 和站點 j 的距離。(0<=距離<=1000)
再然後有一個正整數 K , 表示接下來有K個指令。每個指令佔一行。
當指令開頭為 UP 的時候,接下來有一個整數 T ,表示在面的所在位置有一個要去站點T(0<=T<NCity)的人要上車。
當指令為 GO 的時候,表示Lele要執行法則4,送某些乘客下車。
當然,如果車上當時沒有乘客的話,你就可以忽略這個指令。

注意:
在每組測試開始的時候,Lele的面的總是停在站點0,且車為空
如果在T個指令都結束之後,還發現有人沒下車,則你可以忽略他們。

Output

最後在一行內輸出一個整數,表示Lele的面的一共開了多少距離。

Sample Input

3 0 1 2 1 0 3 2 3 0 9 UP 1 UP 2 GO UP 2 GO GO UP 2 UP 1 GO 0

Sample Output

7

 對題意進行直接的模擬即可。做法是利用MAP將要去的站點與人數作為鍵值對儲存,同時維護一個佇列存放要去往站點的順序。

也可以使用連結串列進行儲存。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
public class Main {
    public static void main(String[] s) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int res=0;
            if(n==0)
                break;
            Queue<Integer> queue = new LinkedList<Integer>();
            int map[][]=new int[n][n];
            for(int i=0;i<n;i++) {
                for(int j=0;j<n;j++) {
                    int tmp=sc.nextInt();
                    map[i][j]=tmp;
                }
            }
            Map<Integer, Integer> mymap =new HashMap<>();
            int t=sc.nextInt();
            int now=0;int people=0;
            for(int i=0;i<t;i++) {
                String s1=sc.next();
                if(s1.equals("UP")) {
                    int pos=sc.nextInt();
                    int flag=0;
                    if(pos!=now&&people<7) {
                        people++;
                        Set myset=mymap.keySet();     //通過SET來對MAP進行一次遍歷
                        Iterator it=myset.iterator();
                        while(it.hasNext()) {
                            int key=(int) it.next();
                            int vaule=mymap.get(key);
                            if(key==pos) {
                                mymap.put(key, vaule+1); //如果這個人也要去這裡,則人數加1
                                flag=1;
                                break;
                            }
                        }
                        if(flag==0) {
                            mymap.put(pos,1);            //如果沒有該站點,則向MAP中加入這一對,然後該站點入佇列
                            queue.offer(pos);
                        }
                    }
                }
                else if(s1.equals("GO")) {
                    if(people>0) {
                        int goal=queue.poll();
                        res+=map[now][goal];
                        now=goal;                //更新當前位置
                        people-=mymap.get(goal);
                        mymap.remove(goal);      //該位置出佇列
                    }   
                }
            }
            System.out.println(res);
        }
    }
}

下沙小面的(2)

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2590    Accepted Submission(s): 1137

Problem Description

前文再續,書接上一題。話說當上小面的司機的Lele在施行他的那一套拉客法則以後,由於走的路線太長,油費又貴,不久便虧本了。(真可憐~)於是他又想了一個拉客的辦法。

對於每一次拉客活動,他一次性把乘客都拉上車(當然也不會超過7個,因為位置只有7個)。然後,Lele計算出一條路線(出於某些目的,Lele只把車上乘客的目的地作為這條路線上的站點),把所有乘客都送到目的地(在這路線上不拉上其他乘客),並且使總路線長度最短。

不過Lele每次都要花很多時間來想路線,你能寫個程式幫他嘛?

Input

本題目包含多組測試。最後一組測試後有一個0代表結束。
每組測試第一行有一個整數NCity(3<=NCity<=30)表示下沙一共有多少個站點(站點從0開始標號)。
然後給你一個 NCity * NCity 的矩陣,表示站點間的兩兩距離。即這個矩陣中第 i 行 第 j 列的元素表示站點 i 和站點 j 的距離。(0<=距離<=1000)
再然後有一個整數K(1<=K<=7),表示Lele拉上車的人數。
接下來的一行裡包括 K 個整數,代表上車的人分別要去的站點。(0<站點<NCity)
注意:
對於每組測試,Lele都是在站點0拉上乘客的。

Output

對於每一組測試,在一行內輸出一個整數,表示最短路線的長度。

Sample Input

3 0 1 2 1 0 3 2 3 0 3 1 1 2 0

Sample Output

4

 由題意知計算從0開始走怎樣路程最小,有k個乘客最多去往去往7個站點,可以直接使用深搜。

import java.util.Arrays;
import java.util.Scanner;
public class Maintest {
	public static int sum=0;
	public static int minn=1000000;
	public static int box[]=new int[50];   //存放要去的站點
	public static int vis[]=new int[50];   //標記陣列
	public static int map[][]=new int[50][50];
    //res是當前走的路程,num是走過了幾個站點,pos是當前站點位置
	public static void dfs(int res,int num,int pos) {
		if(num==sum) {            //一共有sum個站點,全部去過則完成,跳出遞迴。
			if(res<minn)
				minn=res;
			return;
		}
		for(int i=0;i<sum;i++) {
			if(vis[i]==0) {
				vis[i]=1;        //標記
				dfs(res+map[pos][box[i]],num+1,box[i]);
				vis[i]=0;        //回溯
			}
		}
	}
	public static void main(String[] s) {
		Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
        	int n=sc.nextInt();
        	if(n==0)
        		break;
        	minn=1000000;
        	for(int i=0;i<n;i++) {
        		for(int j=0;j<n;j++) {
        			int tmp=sc.nextInt();
        			map[i][j]=tmp;
        		}
        	}
        	int people=sc.nextInt();
        	Arrays.fill(box, 0);Arrays.fill(vis, 0);sum=0;
        	for(int i=0;i<people;i++) {
        		int tmp=sc.nextInt();int flag=0;
        		for(int j=0;j<sum;j++) {
        			if(box[j]==tmp) {
        				flag=1;break;}
        		}
        		if(flag==0) {
        			box[sum++]=tmp;
        		}
        	}
        	dfs(0,0,0);
        	System.out.println(minn);
        }
	}
}