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