愛奇藝2018年23道校招真題

這裏是鏈接:2018校招編程題彙總
第1道:小易喜歡的數列
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
const int mod = 1000000007;
#define ll  long long int
ll map[11][maxn];
int main()
{
    int n,k;
    ll sum,a;
    while(cin>>n>>k)
    {
        for(int i=1;i<=k;++i)
        {
            map[1][i]=1;
        }
        for(int i=2;i<=n;++i)
        {
            sum=0;
            for(int j=1;j<=k;++j)
            {
                sum=(sum+map[i-1][j])%mod;
            }
            for(int j=1;j<=k;++j)
            {
                a=0;
                int p=j;
                for(int m=2;m*p<=k;++m)
                {
                    a=(a+map[i-1][m*p])%mod;
                }
                map[i][j]=(sum-a+mod)%mod;
            }
        }
        ll ans=0;
        for(int i=1;i<=k;++i)
        {
            ans+=map[n][i];
            ans%=mod;
        }
        /*
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=k;++j)
            {
                cout<<map[i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
        */
        cout<<ans<<endl;
    }
    return 0;
}
第2道:循環數比較
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    string num1,num2;
    int a1,a2,flag;
    while(cin>>num1>>a1>>num2>>a2)
    {
        int len1,len2;
        len1=num1.length()*a1;
        len2=num2.length()*a2;
        if(len1<len2)
        {
            cout<<"Less"<<endl;
            continue;
        }else if(len1>len2) 
        {
            cout<<"Greater"<<endl;
            continue;
        }else {
            int p1=0,p2=0;
            for(int i=0;i<len1;++i)
            {
                int a1=num1.length();
                int a2=num2.length();
                if(p1==a1){  p1=0; }
                if(p2==a2){  p2=0; }
                if(num1[p1]<num2[p2])
                {
                    flag=-1;
                    break;
                }
                else if(num1[p1]>num2[p2])
                {
                    flag=1;
                    break;
                }else 
                {
                    p1++,p2++;
                }
            }
        }
        if(flag==-1)
        {
            cout<<"Less"<<endl;
        }else if(flag==1)
        {
            cout<<"Greater"<<endl;
        }else cout<<"Equal"<<endl;
    }
    return 0;
}
第3道:DNA序列
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
const int maxn = 2e3+5;
string str;
int power(int a,int b)
{
	int ans=1;
	for(;b;b>>=1)
	{
		if(b&1) ans=(long long)ans*a;
		a=(long long)a*a;
	}
	return ans;
}
int main()
{
    while(cin>>str)
    {
        int len = str.length();
        for(int i=1;i<=len;++i)
        {
        	set<string> m;
        	int j;
        	for(j=0;i+j<=len;++j)
        	{
        		m.insert(str.substr(j,i));
			}
			if(m.size()<power(4,i))
			{
				//cout<<m.size()<<"   !!!"<<endl;
				cout<<i<<endl;
				break;
			}
		}
    }
    return 0;
}
第4道:判斷題
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,t,a,ans;
    while(cin>>n>>t>>a)
    {
        if(t<=a)
        {
            ans=t+n-a;
        }else 
        {
            ans=a+n-t;
        }
        cout<<ans<<endl;
    }
    return 0;
}
第5道:刪除重複字符
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    string s1;
    char hash_1[256];
    while(cin>>s1)
    {
        memset(hash_1,0,sizeof(hash_1));
        int len=s1.length();
        for(int i=0;i<len;++i)
        {
            if(!hash_1[s1[i]])
            {
                hash_1[s1[i]]=1;
                printf("%c",s1[i]);
            }
        }
        cout<<endl;
    }
    return 0;
}
第6道:空中旅行
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e3+5;
int f[maxn];
int main()
{
    int n,s;
    while(cin>>n>>s)
    {
        for(int i=0;i<n;++i)
        {
            scanf("%d",&f[i]);
        }
        int sum=0,i=0;
        for(;i<n;i)
        {
            sum+=f[i++];
            if(sum>s) break;
        }
        if(i!=n) cout<<i-1<<endl;
        else cout<<i<<endl;
    }
    return 0;
}
第7道:迴文素數
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1e3+5;
int vis[maxn];
void is_prime()
{
    memset(vis,1,sizeof(vis));
    vis[1]=0;
    for(int i=2;i<maxn;++i)
    {
        if(!vis[i]) continue;
        for(int j=2;j*i<maxn;++j)
        {
            vis[i*j]=0;
        }
    }
}
void is_rev()
{
    int s[5];
    int top;
    is_prime();

    for(int i=1;i<maxn;++i)
    {
        if(vis[i])
        {
            top=0;
            int num=i;
            while(num)
            {
                s[top++]=num%10;
                num/=10;
            }
            int flag=0;
            for(int i=0;i<top/2;++i)
            {
                if(s[i]!=s[top-i-1])
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
            {
                vis[i]=0;
            }
        }
    }
}
int main()
{
    int l,r;
    is_rev();
    while(cin>>l>>r)
    {
        int cnt=0;
        for(int i=l;i<=r;++i)
        {
            if(vis[i])cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}
第8道:排序
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
int arr[maxn];
int brr[maxn];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;++i)
        {
            cin>>arr[i];
            brr[i]=arr[i];
        }
        sort(arr,arr+n);
        int cnt=0;
        for(int i=0;i<n;++i)
        {
            if(arr[i]!=brr[i])
            {
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
第9道:字符串價值
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 26;
int arr[maxn];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    string s;
    int n;
    while(cin>>s>>n)
    {
        int len = s.length();
        memset(arr,0,sizeof(arr));
        for(int i=0;i<len;++i)
        {
            arr[s[i]-'a']++;
        }
        //sort(arr,arr+26,cmp);
        /*
        for(int i=0;i<26;++i)
        {
            cout<<arr[i]<<" ";
        }
        cout<<endl;
        */
        for(int i=0;i<n;++i)
        {
            sort(arr,arr+26,cmp);
            arr[0]--;
        }
        /*
        for(int i=0;i<26;++i)
        {
            cout<<arr[i]<<" ";
        }
        cout<<endl;
        */
        int ans=0;
        for(int i=0;i<26;++i)
        {
            ans+=arr[i]*arr[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}
第10道:拼湊正方形
#include<iostream>
#include<algorithm>
#define min2(x,y,z,q) min(min(x,y),min(z,q))
using namespace std;
int main()
{
    int a,b,c,d,ans;
    int x,y,z,q;
    while(cin>>a>>b>>c>>d)
    {
        x=abs(a-b)+abs(a-c)+abs(a-d);
        y=abs(b-a)+abs(b-c)+abs(b-d);
        z=abs(c-a)+abs(c-b)+abs(c-d);
        q=abs(d-a)+abs(d-b)+abs(d-c);
        ans=min2(x,y,z,q);
        cout<<ans<<endl;
    }
    return 0;
}
第11道:區間表達
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e2+5;
int num[maxn];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;++i)
        {
            cin>>num[i];
        }
        int aim=num[0],cnt=1;
        for(int i=1;i<n;++i)
        {
            if(aim+1==num[i])
            {
                aim++;
            }else 
            {
                aim=num[i];
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
第12道:數字遊戲
#include<iostream>
#include<algorithm>
using namespace std;
string sortStr(string s,int len)
{
    for(int i=0;i<len;++i)
    {
        for(int j=0;j<len-1-i;++j)
        {
            if(s[j]>s[j+1])
            {
                char temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
            }
        }
    }
    return s;
}
int main()
{
    int n,len,cnt;
    string str;
    string ans;
    //while(cin>>n)
    {
        cin>>n;
        cnt=-1<<30;
        for(int i=0;i<n;++i)
        {
            cin>>str;
            len=str.length();
            for(int i=0;i<len;++i)
            {   
                if(str[i]=='0') len--;
            }
            if(len>cnt)
            {
                int l=str.length();
                cnt=len;
                str=sortStr(str,l);
                ans=str;
            }else if(len==cnt)
            {
                int l=str.length();            
                str=sortStr(str,l);
                //cout<<str<<endl;
                for(int i=0;i<l;++i)
                {
                    if(str[i]>ans[i])
                    {
                        ans=str;
                        break;
                    }else if(str[i]<ans[i])
                    {
                        break;
                    }
                }
            }
        }
        int len=ans.length();
        for(int i=0;i<len;++i)
        {
        	if(ans[i]!='0')
        	{
        		cout<<ans[i];
			}
		}
		cout<<endl;
    }
    return 0;
}
第13道:紅和綠
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e2+5;
char ans[maxn];
int main()
{
    string str;
    while(cin>>str)
    {
        int aim=1<<30;
        int len = str.length();
        for(int i=0;i<len;++i) ans[i] = 'G';
        for(int i=-1;i<len;++i)
        {
            if(i!=-1) ans[i]='R';
            int cnt=0;
            for(int i=0;i<len;++i)
            {
                if(ans[i]!=str[i])
                {
                    cnt++;
                }
            }
            aim=min(aim,cnt);
        }
        cout<<aim<<endl;
    }
    return 0;
}
第14道:拼湊三角形
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a,b,c;
    while(cin>>a>>b>>c)
    {
        if(a+b>c && a+c>b && b+c>a)
        {
            cout<<a+b+c<<endl;
        }else 
        {
            cout<<(a+b+c-max(a,max(b,c)))*2-1<<endl;
        }
    }
    return 0;
}
第15道:循環數比較
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    string num1,num2;
    int a1,a2,flag;
    while(cin>>num1>>a1>>num2>>a2)
    {
        int len1,len2;
        len1=num1.length()*a1;
        len2=num2.length()*a2;
        if(len1<len2)
        {
            cout<<"Less"<<endl;
            continue;
        }else if(len1>len2) 
        {
            cout<<"Greater"<<endl;
            continue;
        }else {
            int p1=0,p2=0;
            for(int i=0;i<len1;++i)
            {
                int a1=num1.length();
                int a2=num2.length();
                if(p1==a1){  p1=0; }
                if(p2==a2){  p2=0; }
                if(num1[p1]<num2[p2])
                {
                    flag=-1;
                    break;
                }
                else if(num1[p1]>num2[p2])
                {
                    flag=1;
                    break;
                }else 
                {
                    p1++,p2++;
                }
            }
        }
        if(flag==-1)
        {
            cout<<"Less"<<endl;
        }else if(flag==1)
        {
            cout<<"Greater"<<endl;
        }else cout<<"Equal"<<endl;
    }
    return 0;
}
第16道:青草遊戲
#include<stdio.h>
int main()
{
    int n,num;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        num=num%5;
		if(num==0 || num==2) printf("yang\n");
		else  printf("niu\n");
    }
    return 0;
}
第17道:無聊的牛牛和羊羊
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
double cs2(double s)
{
	return s*(s-1)/2.0;
}
double ck2(double k)
{
	return k*(k-1)/2.0;
}
double cs_k1(double i)
{
	return i;
}
double cs_k2(double i)
{
	return i*(i-1)/2;
}
double ck1(double k)
{
	return k;
}
int main()
{
	double n,m;
	while(cin>>n>>m)
	{
		double s=n+m;
		double f0=0.0;
		double f1=s/2.0;
		double ans=0.0;
		for(int k=2;k<=m;++k)
		{
			ans=( 1.0 + f1*(cs_k1(s-k)*ck1(k)/cs2(s)) + f0*( ck2(k)/cs2(s) ) ) / (1.0-(cs_k2(s-k)/cs2(s)));
			f0=f1;
			f1=ans;
		}
		if(m==0)
		{
			printf("%.1lf\n",0.0);
		}else if(m==1)
		{
			printf("%.1lf\n",s/2.0);
		}else 
		{
			printf("%.1lf\n",ans);
		}
	}
	return 0;
} 
第18道:幸運子序列
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 1e5+5;
int arr[maxn];
int main()
{
	int n;	
	while(cin>>n)
	{
		stack<int> s;
		for(int i=0;i<n;++i)
		{
			cin>>arr[i];
		}
		int ans=-1<<30;
		for(int i=0;i<n;++i)
		{
			if(s.empty())
			{
				s.push(arr[i]);
				continue;	
			}	
			while(!s.empty()&&s.top()<=arr[i])
			{
				ans=max(ans,s.top()^arr[i]);
				s.pop();
			}
			
			if(!s.empty() && s.top()>=arr[i])
			{
				ans=max(ans,s.top()^arr[i]);
				s.push(arr[i]);
			}else 
			{
				s.push(arr[i]);
				//continue;	
			}			
		}
		cout<<ans<<endl;
	}
	return 0;
}



第19道:缺失的括號
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int main()
{
	string str;
	while(cin>>str)
	{
		stack<char> s;
		int len = str.length();
		for(int i=0;i<len;++i)
		{
			if(s.empty())
			{
				s.push(str[i]);
				continue;
			}
			if(s.top()=='(' && str[i]=='(')
			{
				s.push(str[i]);
			}else if(s.top()=='(' && str[i]==')')
			{
				s.pop();
			}else if(s.top()==')')
			{
				s.push(str[i]);
			}
		}
		int ans=0;
		while(!s.empty())
		{
			s.pop();
			ans++;		
		}
		cout<<ans<<endl;
	}
	return 0;
}
第20道:最後一位
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long int
ll maxn = 1e18+5;
ll bsearch(ll left,ll ri,ll num);
ll judge(ll i,ll num);
int main()
{
	ll num;
	while(cin>>num)
	{
		if(bsearch(0,maxn,num)==-2)
		{
			cout<<"-1"<<endl;
		}else cout<<bsearch(0,maxn,num)<<endl;		
	}
	return 0;
}
ll bsearch(ll left,ll ri,ll num)
{
	while (left <= ri)
	{
    	ll mid = (left + ri)/2;
    	//cout<<mid<<"mid值"<<endl;
    	if(judge(mid,num)==-1) left = mid+1;
    	else if(judge(mid,num)==1)
		{
			ri=mid-1;
		}else 
		{
			return mid;		
		}
	}
	return -2;
}
ll judge(ll i,ll num)		//i 爲檢驗的值,num 爲 
{
	ll a=i;
	ll b=a;
	while(a)
	{
		a/=10;
		b+=a;		
	}
	//cout<<b<<endl;
	if(b>num)
	{
		return 1;
	}else if(b==num)
	{
		return 0;
	}else {
		return -1;
	}
	return 0;
}





第21道:冒泡排序
在這裏插入代碼片
第22道:括號匹配深度
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxnn = 1e2+5;
char str[maxnn];
int main()
{
    while(~scanf("%s",str))
    {
        stack<char> s; 
        int len=strlen(str);
        int maxn=1,ans=1;
        s.push(str[0]);
        for(int i=1;i<len;++i)
        {
        	if(s.empty())
        	{
        		s.push(str[i]);
        		maxn=1;
        		continue;
			}
        	if(s.top()=='(' && str[i]=='(')
        	{
        		s.push(str[i]);
        		maxn++;
			}else if(s.top()=='(' && str[i]==')')
        	{
        		s.pop();
        		maxn--;
			}
			ans=ans>maxn?ans:maxn;
        }       
        cout<<ans<<endl;
    }
    return 0;
}
第23道:奶牛編號
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long int
const ll mod = 1000000007;
const ll maxn = 1e2+5;
ll arr[maxn];
int main()
{
 	int n;
 	while(cin>>n)
 	{
 		for(ll i=0;i<n;++i)
		{
		 	cin>>arr[i];
		}
		sort(arr,arr+n);	
 		ll sub=0;
 		ll ans=1;
		for(int i=0;i<n;++i)
 		{
 			ans=(ans*(arr[i]-sub++))%mod;
		}
		cout<<ans<<endl;
	}
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章