CSP刷题-0822

服了,csp什么情况,界面总是出错,还不能正常提交。。。
佛了,被网页搞了快一小时,终于能提交了

201803-1 跳一跳

#include <bits/stdc++.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int n,k;
int a[1005]; 
int main()
{
    int i=0,num=0,sum=0;
	cin>>a[i];
	while(a[i]){
		if(a[i]==2){
			if(i>0&&a[i-1]==1)	num=2;
			else	num+=2;
		}else{
			num=1;
		}
		sum+=num;
		i++;
		cin>>a[i];
	} 
	cout<<sum;
    return 0;
}

201803-2 碰撞的小球

typedef struct{
	int pos;
	int v;
}node;

int main()
{
    int n,L,t;
    node d[105];
    int flag[1005];
    memset(flag,0,sizeof(flag));
    cin>>n>>L>>t;
    for(int i=0;i<n;i++){
    	cin>>d[i].pos;
    	d[i].v=1;
	}
	for(int i=0;i<t;i++){
		for(int j=0;j<n;j++){
			d[j].pos+=d[j].v;
			if(d[j].pos==L||d[j].pos==0)	d[j].v*=-1;
		}
		memset(flag,0,sizeof(flag));
		for(int k=0;k<n;k++){
			for(int x=k+1;x<n;x++){
				if(d[k].pos==d[x].pos&&flag[d[k].pos]==0){
					d[k].v*=-1;
					d[x].v*=-1;
					flag[d[k].pos]=1;
				}
			}
		}
	}
	for(int i=0;i<n;i++){
    	cout<<d[i].pos<<' ';
	}
    return 0;
}

201803-3 url映射
第一次提交 50分,仔细看了遍题目,发现< path >时,参数末尾的’/‘被我忽略,加上后再次测验,居然还是50…
有点懵
好的,刚刚又发现 /< int >/和 /< int >,/ < str >/ 和 / < str >, / < path >/ 和 / < path >…都不一样,于是再次修改提交,只有60分啊啊啊.
刚刚看了几篇题解,发现没考虑输入的待匹配url违法情况,于是又添加判断,第四次提交,还是60分…绝望
吐了,刚刚又发现没考虑’0’,结果第五次提交还是60分
我开始怀疑网络问题,于是又交了几遍,还是一样…
老子放弃了,刚刚抄了个题解交上去居然0分,不想搞了,告辞

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <sstream>
using namespace std;
 
typedef struct{
	string r;
	vector<string> p;
	int pflag;
	int end;
}node;


bool legal(string s)
{
	for(int i=0;i<s.size();i++)//如果不是合法的 URL地址返回false 
	   if(s[i]!='/'&&s[i]!='.'&&s[i]!='-'&&s[i]!='_'&&!(isalpha(s[i])||isdigit(s[i])))
		return false;
	return true;
}

int main()
{
	int n,m;
	cin>>n>>m;
	node q[105];
	string url,str;
	for(int i=0;i<n;i++){
		cin>>url>>str;
		q[i].r=str;
		if(url[url.size()-1]=='/')	q[i].end=1;
		else q[i].end=0;
		replace(url.begin(),url.end(),'/',' ');
		istringstream is(url);
		string s;
		while(is>>s){
			q[i].p.push_back(s);
		}
	}
	string line;
	vector<string> para;
	int xflag;
	for(int i=0;i<m;i++){
		para.clear();
		cin>>line;
		if(!legal(line)){
			cout<<404<<endl;
			continue;
		}
		if(line[line.size()-1]=='/')	xflag=1;//结尾有'/‘
		else xflag=0;
		replace(line.begin(),line.end(),'/',' ');
		int flag,j,out=0;
		for(j=0;j<n;j++){//遍历映射规则
			para.clear();
			flag=1;
			istringstream is(line);
			string s;
			int k=0;
			while(is>>s){//进行匹配
				if(s=="")	continue;
				if(k>=q[j].p.size()){
					flag=0;
					break;
				}
				if(q[j].p[k][0]!='<'&&s==q[j].p[k]){
					k++;
					continue;
				}
				else if(q[j].p[k][0]!='<'&&s!=q[j].p[k]){//不符合
					flag=0;
					break;
				}
				if(q[j].p[k]=="<int>"){
					int flag2=1;
					for(int w=0;w<s.size();w++){
						if(s[w]>='0'&&s[w]<='9')	continue;
						else{
							flag2=0;
							break;
						}
					}
					if(flag2==0){//不符合
						flag=0;
						break;
					}
					string sw;
					int v=0;
					while(s[v]=='0')	v++;
					for(int w=v;w<s.size();w++){
						sw.push_back(s[w]);
					}
					if(sw=="")	sw="0";
					para.push_back(sw);
					k++;
				}else if(q[j].p[k]=="<str>"){
					para.push_back(s);
					k++;
				}else if(q[j].p[k]=="<path>"){
					q[j].pflag=1;
					string ss=s;
					while(is>>s){
						ss+='/';
						ss+=s;
					}
					if(xflag==1&&q[j].end!=1){
						ss+='/';
						xflag=0;
					}
					para.push_back(ss);
				}
				
			}
			if(flag==0)	continue;//直接换下一条语句
			else if(xflag==q[j].end){
				cout<<q[j].r<<' ';
				for(int x=0;x<para.size();x++){
					cout<<para[x]<<' ';
				}
				cout<<endl;
				out=1;
				break;
			}
		}

		if(out==0)	cout<<404<<endl;
	}

	system("pause");
}

在这里插入图片描述

20210916 重新写一遍

一点点调试,发现自己好多细节没注意!!!

从60—70分-90分-100分!!!

眼睛都要瞎了…

好吧,代码其实还是有bug的,在acwing上过不了,但是我懒得研究了,CCF测试集水了点…

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <sstream>

using namespace std;

const int N=110;
int n,m;


struct node{
    string name;
    vector<string> url;
}U[N];

vector<string> para;

vector<string> split(string str){
    vector<string>  list;
    int flag=0;
    if(str[str.size()-1]=='/')  flag=1;

    replace(str.begin(),str.end(),'/',' ');
    stringstream s(str);
    string ss;
    while(s>>ss)    list.push_back(ss);

    if(flag)    list.push_back("/");
    return list;
}

bool check(vector<string> u1,vector<string> u2){

    if(u1[u1.size()-1]=="/")//规则以'/‘结尾,匹配对象也需以'/'结尾
        if(u2[u2.size()-1]!="/")    return false;

    int i=0,j=0;
    for(i=0,j=0;i<u1.size(),j<u2.size();i++){

        if(i>=u1.size()||j>=u2.size()) return false;

        if(u1[i]=="<str>"){
            if(u2[j]=="/")  return false;
            para.push_back(u2[j]);
            j++;
        }else if(u1[i]=="<int>"){
            string num;
            int flag=0;
            for(int k=0;k<u2[j].size();k++){
                if(u2[j][k]>='0'&&u2[j][k]<='9'){
                    if(u2[j][k]=='0'&&!flag&&k<u2[j].size()-1)    k++;
                    flag=1;
                    num.push_back(u2[j][k]);
                }else return false;
            }
            para.push_back(num);
            j++;
        }else if(u1[i]=="<path>"){//判断path最后有没有'/',没有的话看参数里是否有'/'
            string path;
            while(j<u2.size()-1){
                
                if(j==u2.size()-2&&u1[u1.size()-1]=="/")   
                     path=path+u2[j++];
                else path+=(u2[j++]+'/');
            }
            if(u2[j]!="/") path=path+u2[j];
            para.push_back(path);
            return true;
        }else{
            if(u1[i]!=u2[j++]) return false;   
        }
    }
    if(i<=u1.size()-1||j<=u2.size()-1)    return false;
    return true;
}

int main()
{
    cin>>n>>m;
    string URL,uname;
    int flag=0;
    for(int i=0;i<n;i++){
        cin>>URL>>uname;
        U[i].name=uname;
        U[i].url=split(URL);
    }
    string p;
    vector<string>  q;
    
    for(int i=0;i<m;i++){
        q.clear();       
        int flag=0;
        cin>>p;
        q=split(p);
        for(int j=0;j<n;j++){
            para.clear();

            if(check(U[j].url,q)){
                flag=1;
                cout<<U[j].name<<' ';
                for(int k=0;k<para.size();k++)  cout<<para[k]<<' ';
                cout<<endl;
                break;
            }
        }
       if(!flag)    cout<<404<<endl;
    }

    system("pause");
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值