2017校招全国笔试第二唱

1.最长公共连续子串

牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。


#include <iostream>
#include <string>
 
using namespace std;
int a[52][52];
int main(){
    string str1;
    string str2;
    getline(cin,str1);
    getline(cin,str2);
    if(str1.length()<1 ||str2.length()<1){
        cout<<'0'<<endl;
        return 0;
    }
    int ans;
    ans=0;
    for(int i=0;i<str1.length();i++){
        for(int j=0;j<str2.length();j++){
            if(str1[i]==str2[j]){
                if(i==0 ||j==0)
                    a[i][j]=1;
                else
                    a[i][j]=a[i-1][j-1]+1;
                if(ans<a[i][j])
                    ans=a[i][j];
            }
        }  
    }
    cout<<ans<<endl;
    return 0;
}

2. 找整除

牛牛想在[a, b]区间内找到一些数满足可以被一个整数c整除,现在你需要帮助牛牛统计区间内一共有多少个这样的数满足条件?

#include <iostream>
#include <math.h>
 
using namespace std;
 
int main(){
    int a,b,c,sum;
    cin>>a>>b>>c;
    sum=(b/c)-(ceil(a/1.0/c))+1;
    cout<<sum<<endl;
    return 0;
}


3.组装三角形

牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。

#include <iostream>
 
using namespace std;
 
int main(){
    int n,ans;
    int a[52];
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    ans=0;
    for(int i=0;i<n-2;i++){
        for(int j=i+1;j<n-1;j++){
            if(i==j)
                continue;
            for(int k=j+1;k<n;k++){
                if(i==k ||j==k)
                    continue;
                if((a[i]+a[j]>a[k])&&(a[i]+a[k]>a[j])&&(a[k]+a[j]>a[i]))
                    ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

4.最小的矩形

牛牛在二维坐标系中画了N个点,且都是整点。现在牛牛想画出一个矩形,使得这N个点都在矩形内或者在矩形上。
矩形的边均平行于坐标轴。牛牛希望矩形的面积最小。请你帮助牛牛计算下最小矩形的面积。

#include <iostream>
using namespace std;
 
int main(){
    int n,minx,maxx,miny,maxy,x,y;
    cin>>n;
    cin>>x>>y;
    maxx=minx=x;
    maxy=miny=y;
    for(int i=1;i<n;i++){
        cin>>x>>y;
        if(x<minx)
            minx=x;
        if(x>maxx)
            maxx=x;
        if(y<miny)
            miny=y;
        if(y>maxy)
            maxy=y;
    }
    cout<<(maxx-minx)*(maxy-miny)<<endl;
    return 0;
}

5. 平衡数

牛牛在研究他自己独创的平衡数,平衡数的定义是:将一个数分成左右两部分,分别成为两个新的数。
左右部分必须满足以下两点:
1,左边和右边至少存在一位。
2,左边的数每一位相乘如果等于右边的数每一位相乘,则这个数称为平衡数。
例如:1221这个数,分成12和21的话,1*2=2*1,则称1221为平衡数,再例如:1236这个数,可以分成123和1*2*3=6,所以1236也是平衡数。而1234无论怎样分也不满足平衡数。

#include <iostream>
#include <string>
#include <math.h>
using namespace std;
 
int main(){
    string str;
    cin>>str;
    int a;
    int sum1=1;
    int sum2=1;
    int sum=0;
    if(str.length()<2){
        cout<<"NO"<<endl;
        return 0;
    }
    for(int i=0;i<str.length();i++){
        a=str[i]-'0';
        if(a==0)
            sum++;
        sum1=sum1*a;
    }
    if(sum>=2){
        cout<<"YES"<<endl;
        return 0;
    }
    int s=sqrt((double)sum1);
    if(s*s!=sum1){
        cout<<"NO"<<endl;
        return 0;
    }
    for(int i=0;i<str.length()-1;i++){
        a=str[i]-'0';
        sum2=sum2*a;
        if(sum2==s){
            cout<<"YES"<<endl;
            return 0;
        }
        if(sum2>s){
            cout<<"NO"<<endl;
            return 0;
        }
    }
    return 0;
}
6. 字符串分类

牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:
A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。
现在牛牛想知道这N个字符串可以分成几类。

#include <iostream>
#include<algorithm>
#include <string>
#include <set>
using namespace std;
 
bool cmp1(char a,char b){
    return a<b;
}
 
set<string>p;
int main(){
    int n;
    char str[52];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>str;
        int s=((string)str).length();
        sort(str,str+s,cmp1); 
        p.insert(str);
    }
    cout<<p.size()<<endl;
    return 0;
}

7. 创造新世界
众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!
牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,
每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。
#include <iostream>
#include <string>
 
using namespace std;
 
int a[22];//0
int b[22];//1
int c[502][502];
int main(){
    int x,n,m;
    cin>>x>>n>>m;
    string str;
    for(int i=1;i<=x;i++){
        cin>>str;
        for(int j=0;j<str.length();j++){
            if(str[j]=='0')
                a[i]++;
            else
                b[i]++;
        }
    }
    for(int i=1;i<=x;i++){
        for(int j=n;j>=a[i];j--){
            for(int k=m;k>=b[i];k--){
                c[j][k]=max(c[j][k],c[j-a[i]][k-b[i]]+1);
            }      
        }
    }
    cout<<c[n][m]<<endl;
    return 0;
}

8. 优美的回文串
牛牛在书上看到一种字符串叫做回文串,当一个字符串从左到右和从右到左读都是一样的,就称这个字符串为回文串。牛牛又从好朋友羊羊那里了解到一种被称为优美的回文串的字符串,考虑一个长度为N只包含大写字母的字符串,写出它所有长度为M的连续子串(包含所有可能的起始位置的子串,相同的子串也要计入),如果这个字符串至少有K个子串都是回文串,我们就叫这个字符串为优美的回文串。现在给出一个N,牛牛希望你能帮他计算出长度为N的字符串有多少个是优美的回文串(每个位置都可以是'A'~'Z'的一个。)
#include <cstdio>
 
long long fac[27], res;
int n, m, k, a[12];
 
bool ok(int from) {
  for (int i = 0; i < m / 2; ++i) {
    if (a[from + i] != a[from + m - i - 1]) {
      return false;
    }
  }
  return true;
}
 
bool ok() {
  int cnt = 0;
  for (int i = 0; i <= n - m; ++i) {
    if (ok(i)) {
      ++cnt;
    }
  }
  return cnt >= k;
}
 
void dfs(int pos, int num) {
  if (pos == n) {
    if (ok()) {
      res += fac[num];
    }
  } else {
    for(int i = 0; i < num; i++) {
      a[pos] = i;
      dfs(pos + 1, num);
    }
    a[pos] = num;
    dfs(pos + 1, num + 1);
  }
}
 
int main() {
  scanf("%d%d%d", &n, &m, &k);
  fac[0] = 1;
  for (int i = 1; i <= 26; ++i) {
    fac[i] = fac[i - 1] * (27 - i);
  }
  dfs(0, 0);
  printf("%lld\n", res);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值