2013年12月CCF软考试题

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值