1.约数个数
2.最大子矩阵
暴力
#include<iostream>
using namespace std;
//子矩阵的和
int a[40][30];
long long res;
int main(){
for(int i=1;i<=30;i++){
for(int j=1;j<=20;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=26;i++){
for(int j=1;j<=16;j++){
long long sum=0;
for(int k=i;k<i+5;k++){
for(int m=j;m<j+5;m++)
sum+=a[k][m];
}
res=max(res,sum);
}
}
cout<<res<<endl;
}
3.奇数次数
#include<iostream>
using namespace std;
//奇数次数
int a[100000+10];
int main(){
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
a[i]=s[i]-'0';
}
int sum=0;
for(int i=0;i<s.size();i++){
if(a[i]%2==1)
sum++;
}
cout<<sum<<endl;
}
4.最大的Y
#include<iostream>
using namespace std;
char a[1000+10][1000+10];
int main(){
int n,m;
cin>>n>>m;
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<n-1;i++){
for(int j=1;j<m-1;j++){ //两层遍历
int sum=0;
for(int k=1;k<=min(min(i,n-i-1),min(j,m-j-1));k++){ //边界
if(a[i][j]==a[i-k][j-k]&&a[i][j]==a[i-k][j+k]&&a[i][j]==a[i+k][j]){
sum++;
}
else
break;
}
res=max(res,sum);
}
}
cout<<res<<endl;
}
5.区间计数
#include<iostream>
using namespace std;
int main(){
int sum=0;
for(int i=0;i<=100;i++){
for(int j=0;j<=100;j++){
if(j-i>=10)
sum++;
}
}
cout<<sum;
}
6.最少步数
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int sum=0;
if(n%3==0)
sum=n/3;
else
sum=n/3+1;
cout<<sum<<endl;
}
7.台阶方案
动态规划,dp[i]=dp[i-a]+dp[i-b]+dp[i-c]; i个阶梯应该是由i-a一步上来加上i-b一步加上i-c一步;
#include<iostream>
#include<cstring>
using namespace std;
long long dp[1000000+10];
int main(){
int n;
cin>>n;
int a,b,c;
cin>>a>>b>>c;
dp[0]=1;
for(int i=1;i<=n;i++){
if(i>=a)
dp[i]+=dp[i-a];
if(i>=b)
dp[i]+=dp[i-b];
if(i>=c)
dp[i]+=dp[i-c];
dp[i]%=1000000007;
}
cout<<dp[n]<<endl;
return 0;
}
8.求余数
求大数用这个办法
#include<iostream>
#include<cstring>
using namespace std;
long long num;
int main(){
string s="12345678901234567890123456789012345678901234567890";
for(int i=0;i<s.size();i++){
num=(num*10+s[i]-'0')%2023;
}
cout<<num;
}
9.最大极小值和最小极大值
#include<iostream>
#include<cstring>
using namespace std;
#include<vector>
int a[10000];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int s=0,b=100000;
for(int i=1;i<n-1;i++){
if(a[i]<a[i+1]&&a[i]<a[i-1]) //极小值
{
s=max(s,a[i]);
}
if(a[i]>a[i+1]&&a[i]>a[i-1]) //极大值
{
b=min(b,a[i]);
}
}
cout<<s<<" "<<b<<endl;
return 0;
}
10.左右相同
#include<iostream>
#include<cstring>
using namespace std;
int l[1000000+10],r[1000000+10];
int main(){
string s;
cin>>s;
long long num=0;
for(int i=0;i<s.size();i++){
if(s[i]=='L'){
l[i]=l[i-1]+1;
}
else
l[i]=l[i-1];
if(s[i]=='R'){
r[i]=r[i-1]+1;
}
else
r[i]=r[i-1];
if(l[i]==r[i])
num++;
}
cout<<num<<endl;
return 0;
}
11.数位和
#include<iostream>
#include<cstring>
using namespace std;
bool isprim(int n){
for(int i=2;i<n/i;i++){
if(n%i==0)
return false;
}
return true;
}
int main(){
int num=0;
for(int i=100;i<1000000;i++){
if(isprim(i)){
int a=0;
while(i){
a+=i%10;
i/=10;
}
if(a==23)
num++;
}
}
cout<<num<<endl;
return 0;
}