CCF试题及答案(C++)

具体代码见下:

#include <iostream> 
using namespace std;
int main(){
	int a[30];
	int n ;
	int count=0;
	while(cin>>n&&n){
		a[count]=n;
		count++;
	}
	int sum=0;
	int num=1;
	for(int i=0;i<count;i++){
		if(a[i]==1){
			sum++;
			num=1;
		}
		else if(a[i]==2){
			sum+=2*num;
			num++;
		}
	}
	cout<<sum<<endl;
}

本题完~~~


具体代码见下:

#include <iostream>
using namespace std;
int main(){
	int n,L,t;
	cin>>n>>L>>t;
	int a[100];
	char right[100];
	for(int i=0;i<n;i++){
		cin>>a[i];
		right[i]=true;
	}
	while(t--){
		for(int i=0;i<n;i++){
			if(right[i]){
				a[i]++;
			}
			else{
				a[i]--;
			}
			if(a[i]==L){
				right[i]=false;
			}
			if(a[i]==0){
				right[i]=true;
			}
		}
		for(int i=0;i<n;i++){
			for(int j=i+1;j<n;j++){
				if(a[i]==a[j]){
				right[i]=!(right[i]);
				right[j]=!(right[j]);
			}
			}
		}
	}
	cout<<a[0];
	for(int i=1;i<n;i++){
		cout<<" "<<a[i];
	}
	cout<<endl;	
	
}

本题有一个注意点:由于第一个测试用例是小球按顺序位置依次为4、6、8,但第二个测试用例小球就不是按从左往右的顺序啦,这个需要注意!我在这一点儿上栽了个跟头,浪费了一点儿时间!

ccf第三题一直是我不太容易突破的瓶颈,一定要仔细看,耐心做,一点儿一点儿解决问题,切勿着急上火~~~

一般ccf第三题这种类型题做起来都较为复杂,不涉及什么算法知识,但是要顾及许多方方面面,稍有遗漏就很容易丢分。然后考试的时候看到这种题容易让人头大。。。。。。哎,说多了都是泪!

个人感觉还是考试的时候先在脑海里想好到底要采用什么办法来解决这道题,认真读清题意,大致有了思路之后,再写代码。

题意分析:

大体上上就是把规则和地址中的“斜杠”两边的字符串给分开,存进vector容器中,然后再一一进行匹配。但是中间却又许多细节需要注意,比如匹配也分几种不同的情况。还有要注意的是:最后地址的情况,有斜杠的和没有斜杠的规则和地址是不能匹配的!!!

代码见下:

#include <bits/stdc++.h>
using namespace std;
string rules[100],name[100];
void divide(vector<string> &v, string str){
	v.clear();
	string temp;
	//temp.clear();
	for(int i=1;i<str.length();i++){
		if(str[i]=='/'){
			v.push_back(temp);
			temp.clear();
		}
		else{
			temp+=str[i];
		}
	}
	if(temp.size()!=0){
		v.push_back(temp);
	}
}

string check(string str){
	//str.clear();
	int flag =1;
	for(int i=0;i<str.length();i++){
		if(str[i]<'0'||str[i]>'9'){
			flag=0;
			break;
		}
	}
	if(flag==1)
	{
		return "<int>";
	}
	else{
		return "<str>";
	}
}
vector <string> canshu;
bool check(string s,string rule){
	vector<string> v1,v2;
	divide(v1,s);
	divide(v2,rule);
//	for(int i=0;i<v1.size();i++){
//		cout<<v1[i]<<endl;
//	}
//	for(int i=0;i<v2.size();i++){
//		cout<<v2[i]<<endl;
//	}
	if(v1.size()<v2.size()){
		return false;
	}
	if(v2.size()>=1){
		if(v1.size()>v2.size()&&v2[v2.size()-1]!="<path>"){
		return false;
	}
	}
	if(v2.size()==0 && v1.size()!=0) return false;
	int count=1;
	canshu.clear();
	for(int i=0;i<v2.size();i++){
		if(v1[i]==v2[i]){
			//cout<<"aa"<<endl;
			count+=(v1[i].length()+1);
		}
		else if(check(v1[i])==v2[i]){
			//cout<<"bb"<<endl;
			//cout<<v1[i]<<"***"<<check(v1[i])<<endl;
			count+=(v1[i].length()+1);
			canshu.push_back(v1[i]);
		}
		else if(v2[i]=="<path>"){
			//cout<<"cc"<<endl;
			//cout<<s.substr(count,s.length()-count)<<endl;
			canshu.push_back(s.substr(count,s.length()-count));
		}
		else{
			return false;
		}
	}
	if(s[s.size()-1]=='/' && rule[rule.size()-1]!='/') return false;
    if(s[s.size()-1]!='/' && rule[rule.size()-1]=='/') return false;
	return true;
}
int strToNum(string str){
	int num=0;
	for(int i=0;i<str.length();i++){
		num=num*10+(str[i]-'0');
	}
	return num;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>rules[i]>>name[i];
	}
	while(m--){
		string s;
		cin>>s;
		bool flag = true;
		int i;
		for(i=0;i<n;i++){
			flag = check(s,rules[i]);
			//cout<<flag<<endl;
			if(flag==true){
				break;
			}
		}
		if(flag==false){
			cout<<"404"<<endl;
		}
		else{
			cout<<name[i];
			for(int i=0;i<canshu.size();i++){
				if(check(canshu[i])=="<int>"){
					cout<<" ";
					cout<<strToNum(canshu[i]);
				}
				else{
					cout<<" "<<canshu[i];
				}
			}
			//cout<<endl;
			puts("");
		}
//		for(int i=0;i<canshu.size();i++){
//			cout<<canshu[i]<<endl;
//		}
	}
	return 0;
}

运行结果见下:

5 4
/articles/2003/ special_case_2003
/articles/<int>/ year_archive
/articles/<int>/<int>/ month_archive
/articles/<int>/<int>/<str>/ article_detail
/static/<path> static_serve
/articles/2004/
year_archive 2004
/articles/1985/09/aloha/
article_detail 1985 9 aloha
/articles/hello/
404
/static/js/jquery.js
static_serve js/jquery.js

  • 14
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值