2017校招全国笔试第二唱

1.最长公共连续子串

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


#include 
#include 
 
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'<

2. 找整除

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

#include 
#include 
 
using namespace std;
 
int main(){
    int a,b,c,sum;
    cin>>a>>b>>c;
    sum=(b/c)-(ceil(a/1.0/c))+1;
    cout<


3.组装三角形

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

#include 
 
using namespace std;
 
int main(){
    int n,ans;
    int a[52];
    cin>>n;
    for(int i=0;i>a[i];
    ans=0;
    for(int i=0;ia[k])&&(a[i]+a[k]>a[j])&&(a[k]+a[j]>a[i]))
                    ans++;
            }
        }
    }
    cout<

4.最小的矩形

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

#include 
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>x>>y;
        if(xmaxx)
            maxx=x;
        if(ymaxy)
            maxy=y;
    }
    cout<<(maxx-minx)*(maxy-miny)<

5. 平衡数

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

#include 
#include 
#include 
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"<=2){
        cout<<"YES"<s){
            cout<<"NO"<
6. 字符串分类

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

#include 
#include
#include 
#include 
using namespace std;
 
bool cmp1(char a,char b){
    return ap;
int main(){
    int n;
    char str[52];
    cin>>n;
    for(int i=0;i>str;
        int s=((string)str).length();
        sort(str,str+s,cmp1); 
        p.insert(str);
    }
    cout<
7. 创造新世界
众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!
牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,
每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。
#include 
#include 
 
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=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<

8. 优美的回文串
牛牛在书上看到一种字符串叫做回文串,当一个字符串从左到右和从右到左读都是一样的,就称这个字符串为回文串。牛牛又从好朋友羊羊那里了解到一种被称为优美的回文串的字符串,考虑一个长度为N只包含大写字母的字符串,写出它所有长度为M的连续子串(包含所有可能的起始位置的子串,相同的子串也要计入),如果这个字符串至少有K个子串都是回文串,我们就叫这个字符串为优美的回文串。现在给出一个N,牛牛希望你能帮他计算出长度为N的字符串有多少个是优美的回文串(每个位置都可以是'A'~'Z'的一个。)
#include 
 
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);
}




添加笔记



你可能感兴趣的:(ACM)