螞蟻感冒 長100釐米的細長直杆子上有n只螞蟻。它們的頭有的朝左,有的朝右。每隻螞蟻都只能沿着杆子向前爬,速度是1釐米/秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。請你計算,當所有螞蟻都爬離杆子時,有多少隻螞蟻患上了感冒。【數據格式】第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。接着的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開杆子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,數據中不會出現0值,也不會出現兩隻螞蟻佔用同一位置。其中,第一個數據代表的螞蟻感冒了。要求輸出1個整數,表示最後感冒螞蟻的數目。例如,輸入:35 -2 8程序應輸出:1再例如,輸入:5-10 8 -20 12 25程序應輸出:3
假設A有感冒 A左邊向右走的螞蟻數目爲lf A右邊向左走的數目爲rg
那麼最後感染的螞蟻數目就是 if+rg+自身
package 訓練; import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; public class 螞蟻感冒 { static int N; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); N = scanner.nextInt(); TreeSet<Ant> treeSet = new TreeSet<>(); Ant firstant = null; for (int i = 0; i < N; i++) { int a = scanner.nextInt(); int dis = a > 0 ? 1 : -1; int cold = 0; Ant ant = null; if (i == 0) { cold = 1;// 第一隻感冒 ant = new Ant(Math.abs(a), dis, cold); firstant = ant; } else { ant = new Ant(Math.abs(a), dis, cold); } treeSet.add(ant); } int lf = 0, rg = 0; int i = 0; boolean flag = false; for (Iterator iterator = treeSet.iterator(); iterator.hasNext();) { Ant ant = (Ant) iterator.next(); if (ant.cold == 1) { flag = true; continue; } if (ant.dis > 0 && !flag)// 左邊頭向右 { lf++; } else if (ant.dis < 0 && flag)// 右邊向左 { rg++; } i++; } System.out.println(lf + rg + 1); } } class Ant implements Comparable<Ant> { int pos;// 螞蟻的位置(絕對值) int dis;// 螞蟻的方向(-1,左 1,右) int cold;// 感冒標識 public Ant(int pos, int dis, int cold) { super(); this.pos = pos; this.dis = dis; this.cold = cold; } @Override public int compareTo(Ant o) { return this.pos - o.pos; } @Override public String toString() { return "Ant [pos=" + pos + ", dis=" + dis + ", cold=" + cold + "]"; } }
搭積木
小明最近喜歡搭數字積木。一共有10塊積木,每個積木上有一個數字,0~9。
搭積木規則:
每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。
最後搭成4層的金字塔形,必須用完所有的積木。
下面是兩種合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
請你計算這樣的搭法一共有多少種?
用數組的框架 改變最後條件即可
package 訓練;
public class 搭積木
{
static int count;
public static void main(String[] args)
{
//排列問題
int []arr={0,1,2,3,4,5,6,7,8,9};
f(arr,0);
System.out.println(count);
}
private static void f(int[] arr, int i)
{
if (i==arr.length)
{
if (check(arr))
{
count++;
}
return;
}
for (int j = i; j < arr.length; j++)
{
int temp=arr[j];arr[j]=arr[i];arr[i]=temp;
f(arr, i+1);
temp=arr[j];arr[j]=arr[i];arr[i]=temp;
}
}
private static boolean check(int[] arr)
{
if (
arr[0]<arr[1]&&
arr[0]<arr[2]&&
arr[1]<arr[3]&&
arr[1]<arr[4]&&
arr[2]<arr[4]&&
arr[2]<arr[5]&&
arr[3]<arr[6]&&
arr[3]<arr[7]&&
arr[4]<arr[7]&&
arr[4]<arr[8]&&
arr[5]<arr[8]&&
arr[5]<arr[9]
)
{
return true;
}
return false;
}
}
X星球要派出一個5人組成的觀察團前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
D國最多可以派出1人。
E國最多可以派出1人。
F國最多可以派出3人。
那麼最終派往W星的觀察團會有多少種國別的不同組合呢?
package 經典的遞歸框架;
public class 組合X星球要派出一個5人組成的觀察團前往W星
{
/**
* X星球要派出一個5人組成的觀察團前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
D國最多可以派出1人。
E國最多可以派出1人。
F國最多可以派出3人。
那麼最終派往W星的觀察團會有多少種國別的不同組合呢?
* @param args
*/
static int count=0;
public static void main(String[] args)
{
int[] data={4,2,2,1,1,3};//每個位置的元素最多取個數
int x[]=new int[data.length];//每個元素取幾個
int n=5;
f4(data,x,0,n);
System.out.println(count);
}
/**
*
* @param data 每個位置的元素最多取個數
* @param x 取法
* @param k 當前位置
* @param goal 還要取得個數
*/
private static void f4(int[] data, int[] x, int k, int goal)
{
if (k==x.length)
{
if (goal==0)
{
printQueue(x);
count++;
}
return;
}
for (int i = 0; i <= Math.min(goal, data[k]); i++)
{ //最多能取多少
x[k]=i;//取幾個
f4(data, x, k+1, goal-i);
}
x[k]=0;//回溯
}
private static void printQueue(int[] x)
{
StringBuffer stringBuffer=new StringBuffer();
for (int i = 0; i < x.length; i++)
{
for (int j = 0; j < x[i]; j++)
{
stringBuffer.append((char)(i+'A')+" ");
}
}
System.out.println(stringBuffer.toString().trim());
}
}