17校招真題題集(3)11-15
注:本系列題目全是按照通過率降序來排列的,基本保證題目難度遞增。
11、
題目名稱:買蘋果
來源:網易
題目描述
小易去附近的商店買蘋果,奸詐的商販使用了捆綁交易,只提供6個每袋和8個每袋的包裝(包裝不可拆分)。 可是小易現在只想購買恰好n個蘋果,小易想購買儘量少的袋數方便攜帶。如果不能購買恰好n個蘋果,小易將不會購買。
輸入描述:
輸入一個整數n,表示小易想購買n(1 ≤ n ≤ 100)個蘋果
輸出描述:
輸出一個整數表示最少需要購買的袋數,如果不能買恰好n個蘋果則輸出-1
示例1
輸入
20
輸出
3
分析:貪心:肯定8個一袋的越多越好,到了最後分情況判斷即可
n=int(input())
q=0
while n>24:
n-=8
q+=1
if n==24 or n==18 or n==20 or n==22:
print(q+3)
elif n==12 or n==16 or n==14:
print(q+2)
elif n==6 or n==8:
print(q+1)
else:
print("-1")
另一種思路:動態規劃/揹包。
12、
問題名稱:素數對
來源:騰訊
題目描述
給定一個正整數,編寫程式計算有多少對質數的和等於輸入的這個正整數,並輸出結果。輸入值小於1000。 如,輸入為10, 程式應該輸出結果為2。(共有兩對質數的和為10,分別為(5,5),(3,7))
輸入描述:
輸入包括一個整數n,(3 ≤ n < 1000)
輸出描述:
輸出對數
示例1
輸入
10
輸出
2
分析:這種資料範圍直接暴力即可。先找素數,然後在素數裡找合是n的數對
n=int(input()) l=[2] for i in range(3,1000)://找素數 q=1 for j in range(2,i): if i%j==0: q=0 break if q==1: l.append(i) s,k=0,0 for i in l://找素數對 for j in l: if i+j==n: s+=1//所有的 if i==j://相同的 k+=1 print((s+k)//2)
13、
問題名稱:不要二
來源:網易
題目描述
二貨小易有一個W*H的網格盒子,網格的行編號為0~H-1,網格的列編號為0~W-1。每個格子至多可以放一塊蛋糕,任意兩塊蛋糕的歐幾里得距離不能等於2。 對於兩個格子座標(x1,y1),(x2,y2)的歐幾里得距離為: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算術平方根 小易想知道最多可以放多少塊蛋糕在網格盒子裡。
輸入描述:
每組陣列包含網格長寬W,H,用空格分割.(1 ≤ W、H ≤ 1000)
輸出描述:
輸出一個最多可以放的蛋糕數
示例1
輸入
3 2
輸出
4
分析:找規律:
所謂歐幾里得距離不能等於二,因為行列都為整數,所以只可能是某一列座標相等而行座標相差2,或者行座標相等而列座標相差2。
就這麼擺唄
l=(input().split())
m=int(l[0])
n=int(l[1])
//橫豎一個一個分邊界情況
if m%4==0:
kk=m
gg=m
elif m%4==1:
kk=m+1
gg=m-1
elif m%4==2:
kk=m+2
gg=m-2
elif m%4==3:
kk=m+1
gg=m-1
if n%4==0:
a=(n/4)*(kk+gg)
elif n%4==1:
a=((n-1)/4)*(kk+gg)+kk/2
elif n%4==2:
a=((n-2)/4)*(kk+gg)+kk
elif n%4==3:
a=((n-3)/4)*(kk+gg)+kk+gg/2
print(int(a))
其實不需要找規律,遞推也可以 定義一個數組a[1000][1000],初始值都為0,從a[0][0]開始,將a[0][2]和a[2][0]置為-1,遍歷陣列,不是-1的地方可以放蛋糕
#include<iostream>
using namespace std;
int a[1000][1000] = {0};
int main()
{
int w,h,res = 0;
cin >> w >> h;
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
if(a[i][j]==0)
{
res++;
if((i+2)<w) a[i+2][j] = -1;
if((j+2)<h) a[i][j+2] = -1;
}
}
}
cout << res;
return 0;
}
14、
問題名稱:統計迴文
來源:網易
題目描述
“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。花花非常喜歡這種擁有對稱美的迴文串,生日的時候她得到兩個禮物分別是字串A和字串B。現在她非常好奇有沒有辦法將字串B插入字串A使產生的字串是一個迴文串。你接受花花的請求,幫助她尋找有多少種插入辦法可以使新串是一個迴文串。如果字串B插入的位置不同就考慮為不一樣的辦法。 例如: A = “aba”,B = “b”。這裡有4種把B插入A的辦法: * 在A的第一個字母之前: "baba" 不是迴文 * 在第一個字母‘a’之後: "abba" 是迴文 * 在字母‘b’之後: "abba" 是迴文 * 在第二個字母'a'之後 "abab" 不是迴文 所以滿足條件的答案為2
輸入描述:
每組輸入資料共兩行。 第一行為字串A 第二行為字串B 字串長度均小於100且只包含小寫字母
輸出描述:
輸出一個數字,表示把字串B插入字串A之後構成一個迴文串的方法數
示例1
輸入
aba b
輸出
2
分析:直接按題意模擬一下即可。
python
a=input()
b=input()
kk=0
for i in range(len(a)+1):
gg=a[0:i]+b+a[i:]
if gg==gg[::-1]:
kk+=1
print(kk)
c++
#include<iostream>
#include<string>
using namespace std;
bool Huiwen(string str1) //判斷迴文
{
int length=str1.length();
for(int i=0;i<length;i++)
{
if(str1[i]!=str1[length-1])
return false;
length=length-1;
}
return true;
}
int main()
{
string str1,str2,temp;
int count,len;
while(cin>>str1>>str2)
{
count = 0;
temp=str1;
len=str1.length()+1;
for(int i=0;i<len;i++)
{
str1=temp;
str1.insert(i,str2); //在A字串中以此插入B字串
if(Huiwen(str1)) //判斷是否是迴文
count=count+1; //統計迴文
}
cout<<count<<endl;
}
return 0;
}
15、
題目名稱:構造佇列
來源:網易有道
題目描述
小明同學把1到n這n個數字按照一定的順序放入了一個佇列Q中。現在他對佇列Q執行了如下程式:
while(!Q.empty()) //佇列不空,執行迴圈 { int x=Q.front(); //取出當前隊頭的值x Q.pop(); //彈出當前隊頭 Q.push(x); //把x放入隊尾 x = Q.front(); //取出這時候隊頭的值 printf("%d\n",x); //輸出x Q.pop(); //彈出這時候的隊頭 }
做取出隊頭的值操作的時候,並不彈出當前隊頭。 小明同學發現,這段程式恰好按順序輸出了1,2,3,...,n。現在小明想讓你構造出原始的佇列,你能做到嗎?[注:原題樣例第三行5有錯,應該為3,以下已修正]
輸入描述:
第一行一個整數T(T ≤ 100)表示資料組數,每組資料輸入一個數n(1 ≤ n ≤ 100000),輸入的所有n之和不超過200000。
輸出描述:
對於每組資料,輸出一行,表示原始的佇列。數字之間用一個空格隔開,不要在行末輸出多餘的空格.
示例1
輸入
4 1 2 3 10
輸出
1 2 1 2 1 3 8 1 6 2 10 3 7 4 9 5
分析:逆向考慮:
c++
#include <iostream>
#include <deque>
using namespace std;
int main()
{
int n, k;
cin >> k;
while(k > 0)
{
deque<int> q;
k--;
cin >> n;
for(int i = n; i > 0; i--)
{
q.push_front(i);
int t = q.back();
q.pop_back();
q.push_front(t);
}
for(int i = 0; i < q.size(); i++)
cout << q[i] << " ";
cout << endl;
}
}
python
nn=int(input())
sum=[]
for i in range(0,nn):
n=int(input())
line = list([j+1 for j in range(n)])
res=[]
while n:
num=line.pop()
res.insert(0,num)
num = res.pop()
res.insert(0,num)
n-=1
sum.append(res)
for res in sum:
print(" ".join(list(map(str,res))))