试题编号: | 201803-1 |
试题名称: | 跳一跳 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。 输入格式 输入包含多个数字,用空格分隔,每个数字都是1,2,0之一,1表示此次跳跃跳到了方块上但是没有跳到中心,2表示此次跳跃跳到了方块上并且跳到了方块中心,0表示此次跳跃没有跳到方块上(此时游戏结束)。 输出格式 输出一个整数,为本局游戏的得分(在本题的规则下)。 样例输入 1 1 2 2 2 1 1 2 2 0 样例输出 22 数据规模和约定 对于所有评测用例,输入的数字不超过30个,保证0正好出现一次且为最后一个数字。 |
#include<iostream>
using namespace std;
int main()
{
int n=0;
int before=0;
int grade=0;
cin>>n;
while(n!=0)
{
if(before==0)
{
grade+=n;
before=n;
}
else if(n==1)
{
grade++;
before=1;
}
else if(n==2)
{
if(before==1)
{
grade+=2;
before=2;
}
else
{
grade+=before+2;
before+=2;
}
}
cin>>n;
}
cout<<grade;
return 0;
}
试题编号: | 201803-2 |
试题名称: | 碰撞的小球 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。 提示 因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。 输入格式 输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置。 输出格式 输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。 样例输入 3 10 5 样例输出 7 9 9 样例说明 初始时,三个小球的位置分别为4, 6, 8。 样例输入 10 22 30 样例输出 6 6 8 2 4 0 4 12 10 2 数据规模和约定 对于所有评测用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L为偶数。 |
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int position;
int speed=1;
int order;
};
bool cmp1(node a,node b)
{
return a.position<b.position;
}
bool cmp2(node a,node b)
{
return a.order<b.order;
}
int main()
{
int n,l,t;
cin>>n>>l>>t;
vector<node> ball(n);
vector<int> length(l+1);
int i=0,k=0,j=0;
for(i=0;i<l+1;i++)
length[i]=-1;
for(i=0;i<n;i++)
{
cin>>ball[i].position;
ball[i].order=i;
}
sort(ball.begin(),ball.end(),cmp1);
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
{
if(ball[j].position==0 || ball[j].position==l)
ball[j].speed=-ball[j].speed;
if(length[ball[j].position] == -1)
{
length[ball[j].position]=j;
ball[j].position+=ball[j].speed;
}
else
{
k=length[ball[j].position];
ball[k].speed=-ball[k].speed;
ball[k].position+=2*ball[k].speed;
ball[j].speed=-ball[j].speed;
ball[j].position+=ball[j].speed;
}
}//for j
for(j=0;j<l+1;j++)
length[j]=-1;
}//for i
sort(ball.begin(),ball.end(),cmp2);
cout<<ball[0].position;
for(i=1;i<n;i++)
cout<<" "<<ball[i].position;
}
试题编号: | 201803-3 70分 emmm再说不想管了 |
试题名称: | URL映射 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。 输入格式 输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。 输出格式 输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。 样例输入 5 4 样例输出 year_archive 2004 样例说明 对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。 数据规模和约定 1 ≤ n ≤ 100,1 ≤ m ≤ 100。 |
#include<iostream>
#include<sstream>
#include<string.h>
#include<vector>
using namespace std;
string str;
struct node
{
string r;//规则
int k=0;//对比到的位置
string name;//规则名
vector<int> type;//<>
int len=0;//<>数量
};
int is_digit(char a)
{
if((a>='0' && a<='9') || a=='-' || a=='.' || a=='_' || (a<='z'&&a>='a') || (a<='Z'&&a>='A'))
return 1;
else
return 0;
}
int is_path(char a)
{
if((a>='0' && a<='9') || a=='-' || a=='.' || a=='_' || (a<='z'&&a>='a') || (a<='Z'&&a>='A') || a=='/')
return 1;
else
return 0;
}
int main()
{
int n,m;
cin>>n>>m;
vector<node> rule(n);
int i=0,j=0,l=0,c=0,flag=0;
for(i=0;i<n;i++)
{
cin>>rule[i].r>>rule[i].name;
for(j=0;j<rule[i].r.size();j++)
{
if(rule[i].r[j]=='<')
{
if(rule[i].k==0)
rule[i].k=j;//前j位相同
switch (rule[i].r[j+1])
{
case 's':
if(rule[i].r[j+5]=='/')
rule[i].type.push_back(-1);
else
rule[i].type.push_back(1);
rule[i].len++;
break;
case 'i':
if(rule[i].r[j+5]=='/')
rule[i].type.push_back(-2);
else
rule[i].type.push_back(2);
rule[i].len++;
break;
case 'p':
rule[i].type.push_back(3);
rule[i].len++;
break;
}
}//if
}//for
}//for
for(i=0;i<m;i++)
{
cin>>str;
for(j=0;j<n;j++)
{
char w[1000];
if(rule[j].len == 0)
{
if(strcmp(str.c_str(),rule[j].r.c_str())==0)
{
cout<<rule[j].name<<endl;
break;
}
}
else if(strncmp(str.c_str(), rule[j].r.c_str(), rule[j].k) == 0)
{
c=0;
l=rule[j].k;
flag=0;
for(int a=0;a<rule[j].len && flag==0;a++)
{
if(c!=0)
{
w[c++]=' ';
}
switch(rule[j].type[a])
{
case 1://l为\0
{
for(;str[l]!='\0' && str[l]!='/';l++)
{
if(is_digit(str[l]))
w[c++]=str[l];
else
{
flag=1;
break;
}
}
if(str[l]=='/')
flag=1;
break;
}
case -1://l为/
{
for(;str[l]!='\0' && str[l]!='/';l++)
{
if(is_digit(str[l]))
{
w[c++]=str[l];
}
else
{
flag=1;
break;
}
}
if(str[l]!='/')
flag=1;
break;
}
case 2:
{
int total=0;
for(;str[l]!='\0' && str[l]!='/';l++)
{
if(str[l]>='0' && str[l]<='9')
{
total=total*10+str[l]-'0';
}
else
{
flag=1;
break;
}
}
if(str[l]=='/')
flag=1;
if(flag!=1)
{
w[c]='\0';
string str1;
stringstream ss;
ss<<total;
ss>>str1;
strcat(w,str1.c_str());
c=c+(int)str1.size();
}
break;
}
case -2:
{
int total=0;
for(;str[l]!='\0' && str[l]!='/';l++)
{
if(str[l]>='0' && str[l]<='9')
{
total=total*10+str[l]-'0';
}
else
{
flag=1;
break;
}
}
if(str[l]!='/')
flag=1;
if(flag!=1)
{
w[c]='\0';
string str1;
stringstream ss;
ss<<total;
ss>>str1;
strcat(w,str1.c_str());
c=c+(int)str1.size();
}
break;
}
case 3:
{
for(;str[l]!='\0';l++)
{
if(is_path(str[l]))
w[c++]=str[l];
else
{
flag=1;
break;
}
}
break;
}
}//switch
l++;
}//for
if(l<str.size())
{
flag=1;
}
if(flag==0 && rule[j].len!=0)
{
w[c]='\0';
cout<<rule[j].name<<" "<<w<<endl;
break;
}
if(rule[j].len==0 && flag==0)
{
cout<<rule[j].name<<endl;
break;
}
}//if
}//for
if(j==n)
cout<<"404"<<endl;
}//for
return 0;
}
试题编号: | 201803-4 |
试题名称: | 棋局评估 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 Alice和Bob正在玩井字棋游戏。 输入格式 输入的第一行包含一个正整数T,表示数据的组数。 输出格式 对于每组数据,输出一行一个整数,表示当前局面的得分。 样例输入 3 样例输出 3 样例说明 第一组数据: 数据规模和约定 对于所有评测用例,1 ≤ T ≤ 5。 |
#include<iostream>
#include<math.h>
using namespace std;
int a[3][3];
int win()
{
int total[8]={0};
for(int i=0;i<3;i++)
{
total[i]=a[i][0]+a[i][1]+a[i][2];
total[i+3]=a[0][i]+a[1][i]+a[2][i];
total[6]+=a[i][i];
total[7]+=a[i][2-i];
}
for(int i=0;i<=7;i++)
{
if(total[i]==3 || total[i]==12)
{
return 0;
}
}
return -1;
}
int dfs(int k,int cnt)
{
if((k==1)&&win()==0)
return -(cnt+1);//bob赢
if((k==4)&&win()==0)
return cnt+1;
if(cnt == 0)
return 0;
int mn=10,mx=-10;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(a[i][j]==0)
{
a[i][j]=k;
if(k==1)
mx=max(mx,dfs(4,cnt-1));
else
mn=min(mn,dfs(1,cnt-1));
a[i][j]=0;
}
if(k==1)
return mx;
return mn;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int cnt=0;
for(int m=0;m<3;m++)
{
for(int j=0;j<3;j++)
{
cin>>a[m][j];
if(a[m][j]==0)
cnt++;
else if(a[m][j]==2)
a[m][j]=4;
}
}
cout<<dfs(1,cnt)<<endl;
}
return 0;
}