2017年校招題

牛牛有一個魚缸。魚缸裏面已經有n條魚,每條魚的大小爲fishSize[i] (1 ≤ i ≤ n,均爲正整數),牛牛現在想把新捕捉的魚放入魚缸。魚缸內存在着大魚吃小魚的定律。經過觀察,牛牛發現一條魚A的大小爲另外一條魚B大小的2倍到10倍(包括2倍大小和10倍大小),魚A會吃掉魚B。考慮到這個,牛牛要放入的魚就需要保證:
1、放進去的魚是安全的,不會被其他魚吃掉
2、這條魚放進去也不能吃掉其他魚

魚缸裏面已經存在的魚已經相處了很久,不考慮他們互相捕食。現在知道新放入魚的大小範圍[minSize,maxSize](考慮魚的大小都是整數表示),牛牛想知道有多少種大小的魚可以放入這個魚缸。


#include<iostream> 
#include<cmath> 
using namespace std; 
int main() 
{ 
    int minSize, maxSize, n, fishsize, count = 0; 
    int size[1001] = { 0 }; 
    cin >> minSize >> maxSize >> n; 
    if(minSize>=1 && minSize<=1000 && maxSize>=1 && maxSize<=1000 && minSize<=maxSize) 
    { 
        for (int i = 1; i <= n; i++) 
        { 
            cin >> fishsize; 
            if(fishsize>=1 && fishsize <=1000) 
            { 
                for (int j = 2 * fishsize; j <= maxSize && j <= 10 * fishsize; j++)             
                    size[j] = 1;         
                for (int j = fishsize / 2; j >= minSize && j >= ceil(fishsize / 10.0); j--)             
                    size[j] = 1;   
            } 
            else 
            { 
                cout<<"input error"<<endl; 
                return 0; 
            }   
        }     
        for (int i = minSize; i <= maxSize; i++)         
            if (size[i] == 0)             
                count++;     
        cout << count;    
    } 
    else 
    { 
        cout<<"input error!!!"<<endl; 
    } 
 
    return 0; 
}

如果一個單詞通過循環右移獲得的單詞,我們稱這些單詞都爲一種循環單詞。 例如:picture 和 turepic 就是屬於同一種循環單詞。 現在給出n個單詞,需要統計這個n個單詞中有多少種循環單詞。


#include<iostream> 
#include <string> 
 
using namespace std; 
 
int main(){ 
    int count=1, n; 
    cin>>n; 
    string S[50],S_new[50]; 
    for(int i=0;i<n;i++) cin>>S[i]; 
    S_new[0]=S[0]+S[0]; 
    if(n==0) { 
        cout<<0; 
        return 0; 
    }
    for(int i=1;i<n;i++){ 
        bool flag=false; 
        for(int j=0;j<count;j++){ 
            if((S_new[j].find(S[i]) != S_new[j].npos)&&(S_new[j].length()/2==S[i].length()))  
                flag=true;
        } 
        if(!flag){ 
            S_new[count]=S[i]+S[i]; 
            count++; 
        }  
    } 
    cout<<count; 
    return 0; 
}

DNA分子是以4種脫氧核苷酸爲單位連接而成的長鏈,這4種脫氧核苷酸分別含有A,T,C,G四種鹼基。鹼基互補配對原則:A和T是配對的,C和G是配對的。如果兩條鹼基鏈長度是相同的並且每個位置的鹼基是配對的,那麼他們就可以配對合成爲DNA的雙螺旋結構。現在給出兩條鹼基鏈,允許在其中一條上做替換操作:把序列上的某個位置的鹼基更換爲另外一種鹼基。問最少需要多少次讓兩條鹼基鏈配對成功

#include <iostream>
#include <string>
 
using namespace std;
 
int main(){
    string st1;
    string st2;
    cin>>st1;
    cin>>st2;
    int len,ans;
    len=st1.length();
    ans=0;
    for(int i=0;i<len;i++){
        int a=st1[i];
        int b=st2[i];
        if((a+b)!=149 && (a+b)!=138)
            ans++;
    }
    printf("%d\n",ans);
    return 0;
}

牛牛的好朋友羊羊在紙上寫了n+1個整數,羊羊接着抹除掉了一個整數,給牛牛猜他抹除掉的數字是什麼。牛牛知道羊羊寫的整數神排序之後是一串連續的正整數,牛牛現在要猜出所有可能是抹除掉的整數。例如:
10 7 12 8 11 那麼抹除掉的整數只可能是9
5 6 7 8 那麼抹除掉的整數可能是4也可能是9


#include <iostream>
 
using namespace std;
 
int main(){
    int n,a,min,max,b;
    long long sum=0;
    scanf("%d",&n);
    min=max=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a);
        sum+=a;
        if(min==0 &&max==0)
            min=max=a;
        if(min>a)
            min=a;
        if(max<a)
            max=a;
    }
    b=((min+max)*(max-min+1))/2-sum;
    if(b==0){
        if(min>1)
            printf("%d ",min-1);
        printf("%d\n",max+1);
        return 0;
    }
    else if(b>min && b<max){
        printf("%d\n",b);
        return 0;
    }
    printf("mistake\n");
    return 0;
}

如果一個數字能表示爲p^q(^表示冪運算)且p爲一個素數,q爲大於1的正整數就稱這個數叫做超級素數冪。現在給出一個正整數n,如果n是一個超級素數冪需要找出對應的p,q。

#include <iostream>
#include <cmath>
 
using namespace std;
 
bool su(long long x){
    long long n= sqrt((double)x);
    for(int i=2;i<=n;i++){
        if(x%i==0)
            return false;
    }
    return true;
}
 
int main(){
    long long a;
    long long b;
    cin>>a;
    for(int i=2;i<=sqrt((double)a);i++){
        b = pow(a,1.0/(double)i); 
        if((a-pow(b,(double)i))==0 && su(b)){
            cout<<b<<" "<<i<<endl;
            return 0;
        }
    }
    printf("No\n");
    return 0;
}

給出一個正整數N和長度L,找出一段長度大於等於L的連續非負整數,他們的和恰好爲N。答案可能有多個,我我們需要找出長度最小的那個。
例如 N = 18 L = 2:
5 + 6 + 7 = 18 
3 + 4 + 5 + 6 = 18
都是滿足要求的,但是我們輸出更短的 5 6 7


#include <iostream>
 
using namespace std;
 
int main(){
    int n,l,mind;
    scanf("%d%d",&n,&l);
    for(int i=l;i<=100;i++){
        if((2*n-i*i+i)%(2*i)==0 && (2*n-i*i+i)>=0){
            int x=(2*n-i*i+i)/(2*i);
            for(int j=0;j<i-1;j++)
                printf("%d ",x+j);
            printf("%d",x+i-1);
            return 0;
        }
    }
    printf("No");
    return 0;
}

牛牛新買了一本算法書,算法書一共有n頁,頁碼從1到n。牛牛於是想了一個算法題目:在這本算法書頁碼中0~9每個數字分別出現了多少次?


#include <iostream>
#include <string>
#include <sstream>
#include <math.h>
 
using namespace std;
 
string st;
int len;
 
double find(int x){
    double sum=0;
    char s[2];
    sprintf(s,"%d",x);
    int a,b,c;
    for(int i=0;i<len;i++){
        c=0;
        if(i==0){
            a=0;
        }
        else{
            istringstream s1;
            s1.str(st.substr(0,i));
            s1>>a;
        }
        if(st[i]>s[0]){
            a++;
        }
        if(s[0]=='0'){
            a--;
        }
        if(st[i]==s[0]){
            istringstream s2;
            s2.str(st.substr(i+1,len));
            s2>>c;
            c++;
        }
        b=len-i-1;
        //cout<<"yuan="<<sum<<"jia="<<(a-1)*pow(10.0,b)+c<<"a="<<a<<"b="<<b<<"c="<<c<<endl;
        sum=sum+(a*pow(10.0,b))+c;
    }
    return sum;
}
 
int main(){
    cin>>st;
    len=st.length();
    double ans;
    ans=find(0);
    printf("%.0lf",ans);
    for(int i=1;i<=9;i++){
        ans=find(i);
        printf(" %.0lf",ans);
    }
    return 0;
}

牛牛正在挑戰一款名爲01翻轉的遊戲。遊戲初始有A個0,B個1,牛牛的目標就是把所有的值都變爲1,每次操作牛牛可以任意選擇恰好K個數字,並將這K個數字的值進行翻轉(0變爲1,1變爲0)。牛牛如果使用最少的操作次數完成這個遊戲就可以獲得獎品,牛牛想知道最少的操作次數是多少?
例如:A = 4 B = 0 K = 3 
0000 -> 1110 -> 1001 -> 0100 -> 1111 
需要的最少操作次數爲4


#include <iostream>
#include <queue>
using namespace std;
  
struct node{
    int x,y,p;
    node(int a,int b,int c):x(a),y(b),p(c){};
};
  
queue<node> fk;
int ft[100005]={0};
int k;
int BFS(){
    int a,b;
    while(!fk.empty()){
        node fn=fk.front();
        fk.pop();
        while(fn.x>=k){
            fn.p+=fn.x/k;
            fn.x=fn.x%k;
        }
        if(fn.x==0){
            return fn.p;
        }
        if((k+fn.x)%2==0 && fn.p>0 && fn.y>=2*k-(fn.x+k)/2)
            return fn.p+1;
        for(int i=1;i<=fn.x;i++){
            if((fn.y+i)>=k){
                a=fn.x+k-i-i;
                b=fn.y-k+i+i;
                if(a==0)
                    return fn.p+1;
                if(ft[a]==0){
                    ft[a]=fn.p+1;
                    node fs(a,b,fn.p+1);
                    fk.push(fs);
                }
            }
        }
    }
    return -1;
}
  
int main(){
    int a,b,minp;
    scanf("%d%d%d",&a,&b,&k);
    if(a==0){
        printf("0\n");
        return 0;
    }
    int sum=a+b;
    int ans=0;
    while(a>=k){
        ans+=a/k;
        a=a%k;
    }
    if(a==0){
        printf("%d\n",ans);
        return 0;
    }
    node tmp(a,sum-a,ans);
    fk.push(tmp);
    ft[a]=ans;
    minp=BFS();
    printf("%d\n",minp);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章