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;
}
牛牛手里有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.
创造新世界
#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;
}
#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);
}