目录
问题B
思路一:
字母数量少的先输出,定义一个结构体,将字母与出现的次数绑定,然后排序输出即可
#include<bits/stdc++.h>
using namespace std;
const int N = 60;
int m;
struct point{
char x;
int y=0;
}len[N];
bool cmp(point a,point b){
if(a.y<b.y)return true;
return false;
}
int main(){
cin>>m;
for(int i=0;i<m;i++){
char c;
cin>>c;
len[c-'a'].x=c;
len[c-'a'].y++;
}
sort(len,len+26,cmp);
for(int i=0;i<=26;i++){
if(len[i].y!=0)
cout<<len[i].x;
}
}
思路二:
通过将用三个数组,一个数组用于记录字母,一个用于记录数目,一个用于记录前两个数组和并后大小的位置
#include<bits/stdc++.h>
using namespace std;
const int N=60;
int m;
char s[N];
int len[N];
char res[N];
int mx;
int main(){
cin>>m;
for(int i=0;i<m;i++){
cin>>s[i];
len[s[i]-'a'+1]++;
}
for(int i=1;i<=26;i++){
if(len[i]){
res[len[i]]='a'+i-1;
if(len[i]>mx)mx=len[i];
}
}
for(int i=1;i<=mx;i++)cout<<res[i];
}
题目C:
思路:
多实例,用两个数组,一个用于记录输入的值,一个用于记录值得个数
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int t;
int len[N];
int res[N];
int ans;
int main(){
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
for(int i=0;i<n;i++){
cin>>len[i];
res[len[i]]++;
}
ans=0;
sort(len,len+n);
for(int i=0;i<n;i++){
if(!res[len[i]])
continue;
if(len[i]*x>100000)
ans++;
if(!res[len[i]*x])
ans++;
else if(res[len[i]*x])
res[len[i]*x]--;
res[len[i]]--;
}
cout<<ans<<endl;
}
}
题目D
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int q;
long long ans,sum1;
long long n,m;
int sum;
int len[N];//存储循环节
void slove(){
for(int i=0;i<=9;i++){
len[i]=m*i%10;
sum+=len[i];
}
//查看有多少循环节
ans=n/m/10;
sum1=ans*sum;
for(int i=1;i<=n/m%10;i++){
if(len[i])
sum1+=len[i];
}
cout<<sum1<<endl;
}
int main(){
cin>>q;
while(q--){
memset(len,0,sizeof(len));
sum1=0;
sum=0;
cin>>n>>m;
slove();
}
}
问题H
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3;
int n,m;
int mp[N][N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
mp[i][j]+=mp[i-1][j]+mp[i][j-1]-mp[i-1][j-1];
}
}
int mx=0;
for(int d=2;d<=min(n,m);d++){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i+d-1>n||j+d-1>m)
break;
int x=mp[i+d-1][j+d-1]-mp[i+d-1][j-1]-mp[i-1][j+d-1]+mp[i-1][j-1];
if(x==d*d)mx=max(mx,d);
}
}
}
cout<<mx;
}
问题I
思路:
用前缀和将D的每段数目存储起来,然后用l,r来维护一端序列
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
char res[N];
int len[N];
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
cin>>res[i];
if(res[i]=='D')
len[i]=1;
else
len[i]=0;
len[i]+=len[i-1];
}
int ans=0;
for(int i=1;i<=n;i++){//枚举区间长度
for(int l=1;l+i-1<=n;l++){
int r=l+i-1;
if(m>=i-len[r]+len[l-1]){
ans=i;
break;
}
}
}
cout<<ans;
}