1. 程式人生 > >17校招真題題集(3)11-15

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