第一届河北工业大学程序设计竞赛校赛
比赛地址:https://ac.nowcoder.com/acm/contest/15703?from=acm_calendar
B-POOLING
题目大意:再一个nm的矩阵中用一个kk的矩阵窗口依次从左到右从上到下移动窗口,每次移动窗口记录这个窗口中最大值,构建出一个新的矩阵。
思路:数据不大暴力解决,可以用四重循环也可也写个函数,个人觉得写个函数更美。
代码:
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
int arr[55][55],k,n,m;
int f(int x,int y)
{
int maxx=0;
for(int i=x;i<x+k;i++)
{
for(int j=y;j<y+k;j++)
{
maxx=max(maxx,arr[i][j]);
}
}
return maxx;
}
int main()
{
int db[55][55];
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(int i=0;i<n-k+1;i++)
{
for(int j=0;j<m-k+1;j++)
{
db[i][j]=f(i,j);
}
}
printf("%d %d\n",n-k+1,m-k+1);
for(int i=0;i<n-k+1;i++)
{
for(int j=0;j<m-k+1;j++)
{
printf("%d%c",db[i][j],j==m-k?'\n':' ');
}
}
return 0;
}
F 回文串
题目大意:给你一个字符串现要将其分割,问你最少能分割成多少个回文串
思路:首先任何一个字符串一定能分割成若干个字符串,最极端就是将字符串分割成n个字符(n为字符串长度),现在问做少可以分割成多少个,我们只要统计有多少个成单出现的字符即可,因为成单出现的字符只能一个人构成字符或者放在回文串中间,所以有多少个成单出现的字符串就最少能构成多少回文串,最后特判一下成单的字符为0的情况。
代码:
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
char arr[1000005];
int db[1000];
int main()
{
int cnt=0;
scanf("%s",arr);
for(int i=0; arr[i]; i++)
{
db[arr[i]]++;
}
for(int i=97; i<123; i++)
{
if(db[i]%2)
{
cnt++;
}
}
cout<<max(cnt,1)<<endl;
return 0;
}