1谅摄、問題描述
在計算機(jī)存儲中淮阐,12.5MB是多少字節(jié)痴晦?
答案:13107200
算法分析
1MB = 1024KB,1KB = 1024B衷掷,所以12.5MB = 12.5 * 1024 * 1024 = 12800KB * 1024 = 13107200 B
2、問題描述
由1對括號盲再,可以組成一種合法括號序列:()西设。
由2對括號,可以組成兩種合法括號序列:()()答朋、(())贷揽。
由4對括號組成的合法括號序列一共有多少種?
答案:14
算法分析
典型的卡特蘭數(shù)問題梦碗,左邊括號的個數(shù)一定大于等于右邊括號的個數(shù)
Java 代碼
public class Main {
static int ans = 0;
static void dfs(int l,int r,int n)
{
if(l == n && r == n)
{
ans ++;
return ;
}
if(l < n)
dfs(l + 1,r,n);
if(r < l)
dfs(l,r + 1,n);
}
public static void main(String[] args) {
int n = 4;
dfs(0,0,n);
System.out.println(ans);
}
}
Java 代碼(所有情況輸出出來)
public class Main {
static int ans = 0;
static void dfs(int l,int r,int n,String s)
{
if(l == n && r == n)
{
ans ++;
System.out.println(s);
return ;
}
if(l < n)
dfs(l + 1,r,n,s + "(");
if(r < l)
dfs(l,r + 1,n,s + ")");
}
public static void main(String[] args) {
int n = 4;
dfs(0,0,n,"");
System.out.println(ans);
}
}
3禽绪、問題描述
一個包含有2019個結(jié)點的無向連通圖,最少包含多少條邊洪规?
答案:2018
算法分析
n
個結(jié)點的無向連通圖最少需要n - 1
條邊
4印屁、問題描述
將LANQIAO中的字母重新排列,可以得到不同的單詞斩例,如LANQIAO雄人、AAILNOQ等,注意這7個字母都要被用上,單詞不一定有具體的英文意義础钠。
請問恰力,總共能排列如多少個不同的單詞。
答案:2520
算法分析
對7
個字母進(jìn)行全排列得7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 = 5040
旗吁,由于A
出現(xiàn)了2
次踩萎,因此需要除掉2!
很钓,得5040 / 2 = 2520
5香府、問題描述(凱撒密碼)
給定一個單詞,請使用凱撒密碼將這個單詞加密码倦。
凱撒密碼是一種替換加密的技術(shù)企孩,單詞中的所有字母都在字母表上向后偏移3位后被替換成密文。即a變?yōu)閐袁稽,b變?yōu)閑柠硕,...,w變?yōu)閦运提,x變?yōu)閍蝗柔,y變?yōu)閎,z變?yōu)閏民泵。
例如癣丧,lanqiao會變成odqtldr。
輸入格式
輸入一行栈妆,包含一個單詞胁编,單詞中只包含小寫英文字母。
輸出格式
輸出一行鳞尔,表示加密后的密文嬉橙。
樣例輸入
lanqiao
樣例輸出
odqtldr
評測用例規(guī)模與約定
對于所有評測用例,單詞中的字母個數(shù)不超過100寥假。
算法分析
模擬
假設(shè)t = g[idx] + 3
市框,表示該字符向后移動3
位的值,若該值比'z'
小直接轉(zhuǎn)換糕韧,否則判斷g[idx]
是等于'x'
枫振,'y'
,'z'
中的哪一個萤彩,映射成'a'
,'b'
,'c'
時間復(fù)雜度
Java 代碼
import java.util.Scanner;
public class Main {
static char[] g;
static void change(int idx)
{
int t = g[idx] + 3;
if(t <= 'z')
{
g[idx] = (char)t;
}
else
{
if(g[idx] == 'x') g[idx] = 'a';
if(g[idx] == 'y') g[idx] = 'b';
if(g[idx] == 'z') g[idx] = 'c';
}
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
g = scan.next().toCharArray();
for(int i = 0;i < g.length;i ++)
{
change(i);
}
System.out.println(String.valueOf(g));
}
}
6粪滤、問題描述(反倍數(shù))
給定三個整數(shù) a, b, c,如果一個整數(shù)既不是 a 的整數(shù)倍也不是 b 的整數(shù)倍還不是 c 的整數(shù)倍雀扶,則這個數(shù)稱為反倍數(shù)杖小。
請問在 1 至 n 中有多少個反倍數(shù)。
輸入格式
輸入的第一行包含一個整數(shù) n。
第二行包含三個整數(shù) a, b, c予权,相鄰兩個數(shù)之間用一個空格分隔县踢。
輸出格式
輸出一行包含一個整數(shù),表示答案伟件。
樣例輸入
30
2 3 6
樣例輸出
10
樣例說明
以下這些數(shù)滿足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。
評測用例規(guī)模與約定
對于 40% 的評測用例议经,1 <= n <= 10000斧账。
對于 80% 的評測用例,1 <= n <= 100000煞肾。
對于所有評測用例咧织,1 <= n <= 1000000,1 <= a <= n籍救,1 <= b <= n习绢,1 <= c <= n。
算法分析
從1
枚舉到n
蝙昙,判斷每個數(shù)是否符合條件即可
時間復(fù)雜度
Java 代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int a = scan.nextInt();
int b = scan.nextInt();
int c = scan.nextInt();
int ans = 0;
for(int i = 1;i <= n;i ++)
{
if(i % a != 0 && i % b != 0 && i % c != 0)
ans ++;
}
System.out.println(ans);
}
}
7闪萄、問題描述(螺旋矩陣)
對于一個 n 行 m 列的表格,我們可以使用螺旋的方式給表格依次填上正整數(shù)奇颠,我們稱填好的表格為一個螺旋矩陣败去。
例如,一個 4 行 5 列的螺旋矩陣如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
輸入格式
輸入的第一行包含兩個整數(shù) n, m烈拒,分別表示螺旋矩陣的行數(shù)和列數(shù)圆裕。
第二行包含兩個整數(shù) r, c,表示要求的行號和列號荆几。
輸出格式
輸出一個整數(shù)吓妆,表示螺旋矩陣中第 r 行第 c 列的元素的值。
樣例輸入
4 5
2 2
樣例輸出
15
評測用例規(guī)模與約定
對于 30% 的評測用例吨铸,2 <= n, m <= 20行拢。
對于 70% 的評測用例,2 <= n, m <= 100诞吱。
對于所有評測用例剂陡,2 <= n, m <= 1000,1 <= r <= n狐胎,1 <= c <= m鸭栖。
算法分析
模擬
類似點蚊香這么走,先又握巢,后下晕鹊,后左,后上
時間復(fù)雜度
Java 代碼
import java.util.Scanner;
public class Main {
static int N = 1010;
static int[][] a = new int[N][N];
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int row = scan.nextInt();
int col = scan.nextInt();
int k = 1,i = 1,j = 1;
a[1][1] = 1;
while(k != n * m)
{
//向右走
while(j < m && a[i][j + 1] == 0)
{
j ++;
a[i][j] = ++ k;
}
//向下走
while(i < n && a[i + 1][j] == 0)
{
i ++;
a[i][j] = ++ k;
}
//向左走
while(j > 1 && a[i][j - 1] == 0)
{
j --;
a[i][j] = ++ k;
}
//向上走
while(i > 1 && a[i - 1][j] == 0)
{
i --;
a[i][j] = ++ k;
}
}
System.out.println(a[row][col]);
}
}
8、問題描述(擺動序列)
如果一個序列的奇數(shù)項都比前一項大溅话,偶數(shù)項都比前一項小晓锻,則稱為一個擺動序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]飞几。
小明想知道砚哆,長度為 m,每個數(shù)都是 1 到 n 之間的正整數(shù)的擺動序列一共有多少個屑墨。
輸入格式
輸入一行包含兩個整數(shù) m躁锁,n。
輸出格式
輸出一個整數(shù)卵史,表示答案战转。答案可能很大,請輸出答案除以10000的余數(shù)以躯。
樣例輸入
3 4
樣例輸出
14
樣例說明
以下是符合要求的擺動序列:
2 1 2
2 1 3
2 1 4
3 1 2
3 1 3
3 1 4
3 2 3
3 2 4
4 1 2
4 1 3
4 1 4
4 2 3
4 2 4
4 3 4
評測用例規(guī)模與約定
對于 20% 的評測用例槐秧,1 <= n, m <= 5;
對于 50% 的評測用例忧设,1 <= n, m <= 10刁标;
對于 80% 的評測用例,1 <= n, m <= 100址晕;
對于所有評測用例命雀,1 <= n, m <= 1000。
算法分析
時間復(fù)雜度
Java 代碼
import java.util.Scanner;
public class Main {
static int N = 1010;
static int mod = 10000;
static int[][] f = new int[N][N];
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int m = scan.nextInt();
int n = scan.nextInt();
for(int i = 1;i <= n;i ++) f[1][i] = 1;
for(int i = 2;i <= m;i ++)
{
if(i % 2 == 0)
{
for(int j = n;j >= 1;j --)
f[i][j] = (f[i - 1][j + 1] + f[i][j + 1]) % mod;
}
else
{
for(int j = 1;j <= n;j ++)
f[i][j] = (f[i - 1][j - 1] + f[i][j - 1]) % mod;
}
}
long res = 0;
for(int i = 1;i <= n;i ++) res = (res + f[m][i]) % mod;
System.out.println(res);
}
}
9斩箫、問題描述(植樹)
小明和朋友們一起去郊外植樹吏砂,他們帶了一些在自己實驗室精心研究出的小樹苗。
小明和朋友們一共有 n 個人乘客,他們經(jīng)過精心挑選狐血,在一塊空地上每個人挑選了一個適合植樹的位置,總共 n 個易核。他們準(zhǔn)備把自己帶的樹苗都植下去匈织。
然而,他們遇到了一個困難:有的樹苗比較大牡直,而有的位置挨太近缀匕,導(dǎo)致兩棵樹植下去后會撞在一起。
他們將樹看成一個圓碰逸,圓心在他們找的位置上乡小。如果兩棵樹對應(yīng)的圓相交,這兩棵樹就不適合同時植下(相切不受影響)饵史,稱為兩棵樹沖突满钟。
小明和朋友們決定先合計合計胜榔,只將其中的一部分樹植下去,保證沒有互相沖突的樹湃番。他們同時希望這些樹所能覆蓋的面積和(圓面積和)最大夭织。
輸入格式
輸入的第一行包含一個整數(shù) n ,表示人數(shù)吠撮,即準(zhǔn)備植樹的位置數(shù)尊惰。
接下來 n 行,每行三個整數(shù) x, y, r泥兰,表示一棵樹在空地上的橫弄屡、縱坐標(biāo)和半徑。
輸出格式
輸出一行包含一個整數(shù)逾条,表示在不沖突下可以植樹的面積和。由于每棵樹的面積都是圓周率的整數(shù)倍投剥,請輸出答案除以圓周率后的值(應(yīng)當(dāng)是一個整數(shù))师脂。
樣例輸入
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
樣例輸出
12
評測用例規(guī)模與約定
對于 30% 的評測用例,1 <= n <= 10江锨;
對于 60% 的評測用例吃警,1 <= n <= 20;
對于所有評測用例啄育,1 <= n <= 30酌心,0 <= x, y <= 1000,1 <= r <= 1000挑豌。
算法分析
dfs
每一種情況安券,枚舉到當(dāng)前的圈圈,有選和不選兩種情況氓英,當(dāng)當(dāng)前圈圈和前面選了的圈圈沒有重復(fù)的面積侯勉,則可以選,也可以選擇不選铝阐,最壞的情況是所有圈圈都能選址貌,則要運(yùn)行2^30 = 10^9
次,check
函數(shù)還需要額外遍歷u
次徘键,分分鐘有g(shù)g的風(fēng)險练对,如果有沖突的圈圈則可以進(jìn)行剪枝,可以降低次數(shù)
時間復(fù)雜度
不好分析吹害,存在的上限
Java 代碼
import java.util.Scanner;
public class Main {
static int N = 35;
static int n;
static int[] x = new int[N];
static int[] y = new int[N];
static int[] r = new int[N];
static int ans = Integer.MIN_VALUE;
static boolean[] st = new boolean[N];
static boolean check(int u)
{
for(int i = 0;i < u;i ++)
{
if(st[i])
{
int d = (x[i] - x[u]) * (x[i] - x[u]) + (y[i] - y[u]) * (y[i] - y[u]);
if((r[i] + r[u]) * (r[i] + r[u]) > d) return false;
}
}
return true;
}
static void dfs(int u,int sum)
{
if(u == n)
{
ans = Math.max(ans, sum);
return ;
}
//選
if(check(u))
{
st[u] = true;
dfs(u + 1,sum + r[u] * r[u]);
st[u] = false;
}
//不選
dfs(u + 1,sum);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
for(int i = 0;i < n;i ++)
{
x[i] = scan.nextInt();
y[i] = scan.nextInt();
r[i] = scan.nextInt();
}
dfs(0,0);
System.out.println(ans);
}
}
10螟凭、問題描述(通電)
2015年,全中國實現(xiàn)了戶戶通電它呀。作為一名電力建設(shè)者赂摆,小明正在幫助一帶一路上的國家通電挟憔。
這一次,小明要幫助 n 個村莊通電烟号,其中 1 號村莊正好可以建立一個發(fā)電站绊谭,所發(fā)的電足夠所有村莊使用。
現(xiàn)在汪拥,這 n 個村莊之間都沒有電線相連达传,小明主要要做的是架設(shè)電線連接這些村莊,使得所有村莊都直接或間接的與發(fā)電站相通迫筑。
小明測量了所有村莊的位置(坐標(biāo))和高度宪赶,如果要連接兩個村莊,小明需要花費兩個村莊之間的坐標(biāo)距離加上高度差的平方脯燃,形式化描述為坐標(biāo)為 (x_1, y_1) 高度為 h_1 的村莊與坐標(biāo)為 (x_2, y_2) 高度為 h_2 的村莊之間連接的費用為
sqrt((x_1-x_2)(x_1-x_2)+(y_1-y_2)(y_1-y_2))+(h_1-h_2)*(h_1-h_2)搂妻。
在上式中 sqrt 表示取括號內(nèi)的平方根。請注意括號的位置辕棚,高度的計算方式與橫縱坐標(biāo)的計算方式不同欲主。
由于經(jīng)費有限,請幫助小明計算他至少要花費多少費用才能使這 n 個村莊都通電逝嚎。
輸入格式
輸入的第一行包含一個整數(shù) n 扁瓢,表示村莊的數(shù)量。
接下來 n 行补君,每個三個整數(shù) x, y, h引几,分別表示一個村莊的橫、縱坐標(biāo)和高度挽铁,其中第一個村莊可以建立發(fā)電站伟桅。
輸出格式
輸出一行,包含一個實數(shù)叽掘,四舍五入保留 2 位小數(shù)贿讹,表示答案。
樣例輸入
4
1 1 3
9 9 7
8 8 6
4 5 4
樣例輸出
17.41
評測用例規(guī)模與約定
對于 30% 的評測用例够掠,1 <= n <= 10民褂;
對于 60% 的評測用例,1 <= n <= 100疯潭;
對于所有評測用例赊堪,1 <= n <= 1000,0 <= x, y, h <= 10000竖哩。
算法分析
稠密圖求最小生成樹問題哭廉,prim
算法,先求出每個點都其他點的距離相叁,跑一遍prim
注意:花費是Math.sqrt(x * x + y * y ) + z * z
遵绰,特別注意
時間復(fù)雜度
Java 代碼
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N = 1010;
static int n;
static int INF = 0x3f3f3f3f;
static double[][] g = new double[N][N];
static int[] a = new int[N];
static int[] b = new int[N];
static int[] c = new int[N];
static double[] dist = new double[N];
static boolean[] st = new boolean[N];
static double get(int i,int j)
{
int x = a[i] - a[j];
int y = b[i] - b[j];
int z = c[i] - c[j];
return Math.sqrt(x * x + y * y ) + z * z;
}
static double prim()
{
Arrays.fill(dist, INF);
double res = 0;
for(int i = 0;i < n;i ++)
{
//找最近點
int t = -1;
for(int j = 1;j <= n;j ++)
{
if(!st[j] && (t == -1 || dist[j] < dist[t]))
t = j;
}
//標(biāo)記
st[t] = true;
if(i != 0) res += dist[t];
//更新
for(int j = 1;j <= n;j ++)
{
dist[j] = Math.min(dist[j], g[t][j]);
}
}
return res;
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
for(int i = 1;i <= n;i ++)
{
String[] s1 = br.readLine().split(" ");
int x = Integer.parseInt(s1[0]);
int y = Integer.parseInt(s1[1]);
int z = Integer.parseInt(s1[2]);
a[i] = x;
b[i] = y;
c[i] = z;
}
for(int i = 1;i <= n;i ++)
for(int j = i + 1;j <= n;j ++)
{
double d = get(i,j);
g[i][j] = g[j][i] = d;
}
System.out.printf("%.2f",prim());
}
}