A.出现次数最多的数
题目链接:http://118.190.20.162/view.page?gpid=T5
水题,直接使用一个map即可。
#include<cstdio>
#include<map>
using namespace std;
int main(){
int n;
scanf("%d",&n);
map<int,int> mp;
map<int,int>::iterator i;
while(n--){
int tp;
scanf("%d",&tp);
mp[tp]++;
}
int count=0,rel=-1;
for(i=mp.begin();i!=mp.end();i++){
if(i->second>count){
rel=i->first;
count=i->second;
}
}
printf("%d\n",rel);
return 0;
}
B.ISBN号码
题目链接:http://118.190.20.162/view.page?gpid=T4
对字符串的简单处理,也比较水。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
void split(string s,char c,vector<string> &vs){ //分割字符串
int start=0;
for(int i=0;i<s.length();i++){
if(s[i]==c){
vs.push_back(s.substr(start,i-start));
start=i+1;
}
}
if(start<s.length()){
vs.push_back(s.substr(start,s.length()-start));
}
}
bool judgeString(vector<string> vt){
if(vt.size()!=4) return false;
if(vt[0].length()==1 && vt[1].length()==3 && vt[2].length()==5 && vt[3].length()==1){
return true;
}
return false;
}
bool judgeNum(vector<string> vt,char & rel){
string s=vt[0]+vt[1]+vt[2];
int count=0;
for(int i=0;i<s.length();i++){
count+=(s[i]-'0')*(i+1);
}
int mod=count%11;
char ct=vt[3][0];
if(mod<10 && mod==ct-'0'){
return true;
}else if(mod==10 && ct=='X'){
return true;
}
rel=mod<10?mod+'0':'X';
return false;
}
int main(){
char buf[20];
scanf("%s",buf);
string s(buf);
vector<string> vt;
split(s,'-',vt);
char c;
if(judgeString(vt) && judgeNum(vt,c)){
printf("Right");
}else{
string str=vt[0]+"-"+vt[1]+"-"+vt[2]+"-";
str.insert(str.end(),c);
printf("%s",str.c_str());
}
return 0;
}
C.最大的矩形
题目链接:http://118.190.20.162/view.page?gpid=T3
我运用的是动态规划的思想,dp[i]表示左侧i个矩形的最优解,然后每加入一个矩形,dp[i]=max{dp[i-1],加入矩形面积,加入矩形和左侧矩形相连面积},根据这个状态转移方程可以求得此题。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=1010;
int a[MAXV];
int dp[MAXV];
int n;
int main(){
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
dp[0]=a[0];
for(int i=1;i<n;i++){
int imax=dp[i-1];
//取决于它的面积,它和左侧每个矩形连起来的面积
for(int j=i;j>=0;j--){
int imin=a[i];
for(int k=j;k<=i;k++){
if(a[k]<imin){
imin=a[k];
}
}
imax=max(imax,imin*(i-j+1));
}
dp[i]=imax;
}
printf("%d\n",dp[n-1]);
return 0;
}
D.有趣的数
题目链接:http://118.190.20.162/view.page?gpid=T2
这个题我是真的不会,使用暴力只得了20分。
参考博客https://www.cnblogs.com/Norlan/p/5011059.html
也是运用的动态规划思想,只是这个我觉得真的不太好想,做过以后希望遇到类似的我能解出来吧,对数位运用动态规划真的是神来之笔,看完解法真的给跪了。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/*
2 0
2 0 1
2 3 2
2 0 1 3
2 0 3 4
2 0 1 3 5
*/
const int MAXV=1010;
ll dp[MAXV][6];
int n;
int main(){
scanf("%d",&n);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i][0]=1;
dp[i][1]=(dp[i-1][0]+dp[i-1][1]*2)%1000000007;
dp[i][2]=(dp[i-1][0]+dp[i-1][2])%1000000007;
dp[i][3]=(dp[i-1][1]+dp[i-1][3]*2)%1000000007;
dp[i][4]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][4]*2)%1000000007;
dp[i][5]=(dp[i-1][3]+dp[i-1][4]+dp[i-1][5]*2)%1000000007;
}
printf("%lld",dp[n][5]);
return 0;
}
E.I’m stuck!
题目链接:http://118.190.20.162/view.page?gpid=T1
这个题放在最后我觉得应该是最难的吧,但是我使用暴力竟然直接就是满分,一发入魂简直不要太舒服。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=60;
const int START=0;
const int END=1;
vector<string> G;
bool S[MAXV][MAXV];
bool E[MAXV][MAXV];
int R,C;
int start[2];
int end[2];
void dfs(int i,int j,int type){
if(i<0 || j<0 || i>=R || j>=C) return;
if(type==START && S[i][j]) return;
if(type==END && E[i][j]) return;
if(G[i][j]=='#') return;
else{
if(type==START) S[i][j]=true;
if(type==END) E[i][j]=true;
}
switch(G[i][j]){
case 'S':
case 'T':
case '+':
dfs(i+1,j,type);
dfs(i-1,j,type);
dfs(i,j+1,type);
dfs(i,j-1,type);
break;
case '-':
dfs(i,j+1,type);
dfs(i,j-1,type);
break;
case '|':
dfs(i+1,j,type);
dfs(i-1,j,type);
break;
case '.':
dfs(i+1,j,type);
break;
}
}
int main(){
scanf("%d%d",&R,&C);
char buf[1000];
for(int i=0;i<R;i++){
scanf("%s",buf);
string s(buf);
G.push_back(s);
}
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
if(G[i][j]=='S'){
start[0]=i;
start[1]=j;
}else if(G[i][j]=='T'){
end[0]=i;
end[1]=j;
}
}
}
memset(S,false,sizeof(S));
dfs(start[0],start[1],START);
if(!S[end[0]][end[1]]){
printf("I'm stuck!");
}else{
int count=0;
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
if(S[i][j]){
memset(E,false,sizeof(E));
dfs(i,j,END);
if(!E[end[0]][end[1]]){
count++;
}
}
}
}
printf("%d",count);
}
return 0;
}