1.出现次数最多的数
思路
数据范围很小,数组模拟哈希
实现
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int n,a[N];
int ans;
int main()
{
int t;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&t);
a[t]++;
}
for(int i=0;i<N;i++)
{
if(a[i]>a[ans]) ans = i;
}
cout<<ans;
}
2.ISBN号码
思路
模拟,注意末位为’X’的情况即可
实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
int ans = 0;
string a;
cin>>a;
int n=a.size();
int cnt = 0;
for(int i = 0; i < n-1; i ++)
{
if(a[i] != '-')
{
ans += (a[i]-'0')*(++cnt);
}
}
ans%=11;
if((a[n-1]-'0')==ans ||((ans==10)&&(a[n-1]=='X'))) cout<<"Right";
else
{
if(ans==10)
{
a[n-1] = 'X';
cout<<a;
}
else
{
a[n-1] = ans+'0';
cout<<a;
}
}
}
3.最大的矩形
思路
枚举高度,寻找左右边界 n平方的复杂度
实现
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,a[N];
int ans;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
int l = i,r = i;
while(l>=0 && a[l]>=a[i]) --l;
while(r<n && a[r]>=a[i]) ++r;
if((r-l-1)*a[i]>ans)
{
ans = (r-l-1)*a[i];
}
}
cout<<ans;
}
4.有趣的数
思路
有趣的题…一开始还想搜索来着
其实是计数问题
需要用longlong,计算组合数的时候要模p不然会超范围…
实现
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const long long p = 1000000007;
long long n;
long long c[N][N];
long long ans;
int main()
{
cin>>n;
for(int i=0;i<n;i++) c[i][0] = 1;
for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
c[i][j] = (c[i-1][j]+c[i-1][j-1])%p;
//cout<<c[i][j]<<endl;
}
}
for(long long i=2;i<=n-2;i++)
{
// cout<<i-1<<" "<<n-i-1<<endl;
long long t1 = (c[n-1][i]*(i-1))%p;
ans = (ans + t1*(n-i-1))%p;
//cout<<ans<<endl;
}
cout<<ans;
}
5.I’m stuck!
思路
两次dfs
实现
#include <bits/stdc++.h>
using namespace std;
const int N = 60;
char G[N][N];
int r,c;
int sx,sy,tx,ty;
int flag1[N][N],flag2[N][N];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
bool check(int x,int y,int i)
{
if(G[x][y]=='#') return 0;
if(G[x][y]=='+' || G[x][y]=='S' || G[x][y]=='T') return 1;
if(G[x][y]=='-' && ((i==1)||(i==3))) return 1;
else if(G[x][y]=='|' &&(i==0||i==2)) return 1;
else if(G[x][y]=='.' &&(i==2)) return 1;
return 0;
}
void dfs1(int x,int y)
{
flag1[x][y] = 1;
for(int i=0;i<4;i++)
{
if(!flag1[x+dx[i]][y+dy[i]] && check(x,y,i) && G[x+dx[i]][y+dy[i]]!='#' && x+dx[i]>=0 && x+dx[i]<r &&y+dy[i]>=0 &&y+dy[i]<c)
{
//cout<<x+dx[i]<<" "<<y+dy[i]<<" i:"<<i<<endl;
dfs1(x+dx[i],y+dy[i]);
}
}
}
void dfs2(int x,int y)
{
flag2[x][y] = 1;
for(int i=0;i<4;i++)
{
if(!flag2[x+dx[i]][y+dy[i]] && check(x+dx[i],y+dy[i],i^2) && G[x+dx[i]][y+dy[i]]!='#' && x+dx[i]>=0 && x+dx[i]<r &&y+dy[i]>=0 &&y+dy[i]<c)
{
//cout<<x+dx[i]<<" "<<y+dy[i]<<" i:"<<i<<endl;
dfs2(x+dx[i],y+dy[i]);
}
}
}
int main()
{
cin>>r>>c;
for(int i=0;i<r;i++)
{
scanf("%s",G[i]);
for(int j=0;j<c;j++)
{
if(G[i][j]=='S')
{
sx = i,sy = j;
}
if(G[i][j]=='T')
{
tx = i,ty = j;
}
}
}
dfs1(sx,sy);
// for(int i=0;i<r;i++)
// {
// for(int j=0;j<c;j++)
// cout<<flag1[i][j];
// cout<<endl;
// }
dfs2(tx,ty);
// for(int i=0;i<r;i++)
// {
// for(int j=0;j<c;j++)
// cout<<flag2[i][j];
// cout<<endl;
// }
if(flag1[tx][ty]==0)
{
cout<<"I'm stuck!";
return 0;
}
int ans = 0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
if(flag1[i][j] && (!flag2[i][j]))
ans++;
}
cout<<ans;
}