河南省第四届大学生程序设计竞赛
Problem A: 序号互换 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 34 Solved: 9 [Submit][Status][Web Board] Description Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来。单元格的行坐标是由数字编号的数字序号,而列坐标使用字母序号。观察字母序号,发现第1列到第26列的字母序号分别为A,B,…,Z,接着,第27列序号为AA,第28列为AB,依此类推。
若给Dr.Kong的机器人卡多一个数字序号(比如32),它能很快算出等价的字母序号(即AF),若给机器人一个字母序号(比如AA)),它也能很快算出等价的数字序号(27),你能不能与卡多比试比试,看谁能算得更快更准确。
Input 第一行: N 表示有多少组测试数据。
接下来有N行, 每行或者是一个正整数,或者是一个仅由大写字母组成的字符串。
Output 对于每一行测试数据,输出一行。如果输入为一个正整数序号,则输出等价的字母序号;如果输入为字符串,则输出等价的数字序号。
Sample Input 3 27 G AA Sample Output AA 7 27
根据题意转换一下就好,没啥坑
#include
using namespace std;
int T;
int n;
string s;
void changen()
{
s="";
while(n)
{
char c;
int t=n%26;
c='A'-1+t;
if(!t)c='Z';
//cout<<c<<endl;
s=c+s;
n/=26;
}
}
void changes()
{
n=0;
int base=1;
for(int i=s.size()-1;i>=0;i--)
{
n+=base*(s[i]-'A'+1);
base*=26;
}
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d",&T))
{
while(T--)
{
cin.get();
if(cin.peek()>='0'&&cin.peek()<='9')
{
scanf("%d",&n);
changen();
cout<<s<<endl;
}
else
{
cin>>s;
changes();
cout<<n<<endl;
}
}
}
return 0;
}
Problem B: 节 能 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 2 Solved: 1 [Submit][Status][Web Board] Description Dr.Kong设计的机器人卡多越来越聪明。最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧上所有的路灯。
卡多每到早晨5:00准会在ZK大道上某盏路灯的旁边,然后他开始关灯。每盏灯都有一定的功率,机器人卡多有着自觉的节能意识,它希望在关灯期间,ZK大道右侧上所有路灯的耗电量总数是最少的。
机器人卡多以1m/s的速度行走。假设关灯动作不需要花费额外的时间,因为当它通过某盏路灯时就顺手将灯关掉。
请你编写程序,计算在给定路灯设置,灯泡功率以及机器人卡多的起始位置的情况下,卡多关灯期间,ZK大道上所有灯耗费的最小能量。
Input 第一行: N 表示ZK大道右侧路灯的数量 (2≤ N ≤ 1000)
第二行: V 表示机器人卡多开始关灯的路灯号码。 (1≤V≤N)
接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数
D表示该路灯与ZK大道起点的距离 (用米为单位来表示),
W表示灯泡的功率,即每秒该灯泡所消耗的能量数。路灯是按顺序给定的。
( 0≤D≤1000, 0≤W≤1000 )
Output 输出一个整数,即消耗能量之和的最小值。注意结果小于200,000,000
Sample Input 4 3 2 2 5 8 6 1 8 7 Sample Output 56
Problem C: 表达式求值 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 35 Solved: 8 [Submit][Status][Web Board] Description Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
-
一个正的十进制数 x 是一个表达式。
-
如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
-
如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
Input 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
Output 输出有N行,每一行对应一个表达式的值。
Sample Input 3 add(1,2) max(1,999) add(min(1,1000),add(100,99)) Sample Output 3 999 200
第一种方法,一个字符一个字符的处理,但就是过不了,路过的大佬请指点呀
第二种方法是吧整个字符串输入进来然后从后往前处理,逻辑比较清晰,代码也很简单。
第一种:
#include
#define ll long long
using namespace std;
int n;
string f;
void getblack()
{
char c=cin.peek();
if(c==EOF)return ;
while(c==' '||c=='
'||c==','||c=='('||c==')')
{
cin.get();
c=cin.peek();
}
}
ll read()
{
getblack();
string a="";
for(int i=0;i!=3;i++)
{
a+=cin.get();
}
getblack();
ll num1,num2;
if(cin.peek()>='0'&&cin.peek()<='9')
{
cin>>num1;
}
else
{
num1 = read();
}
getblack();
if(cin.peek()>='0'&&cin.peek()<='9')
{
cin>>num2;
}
else
{
num2 = read();
}
if(a[2]=='d')return num1+num2;
if(a[2]=='n')return min(num1,num2);
else return max(num1,num2);
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
for(int i=0;i!=n;i++)
{
cout<<read()<<endl;
}
getblack();
}
return 0;
}
第二种:
#include
using namespace std;
int n;
string s;
stack sta;
int read()
{
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]==','||s[i]=='('||s[i]==')'||s[i]==' ')continue;
if(s[i]>='0'&&s[i]<='9')
{
int sum=0;
int base=1;
while(s[i]>='0'&&s[i]<='9')
{
sum+=(s[i]-'0')*base;
base*=10;
i--;
}
sta.push(sum);
}
if(s[i]=='d')
{
int num1 =sta.top();
sta.pop();
int num2 = sta.top();
sta.pop();
sta.push(num1+num2);
i-=3;
}
if(s[i]=='n')
{
int num1 =sta.top();
sta.pop();
int num2 = sta.top();
sta.pop();
sta.push(min(num1,num2));
i-=3;
}
if(s[i]=='x')
{
int num1 =sta.top();
sta.pop();
int num2 = sta.top();
sta.pop();
sta.push(max(num1,num2));
i-=3;
}
}
int ans=sta.top();
sta.pop();
return ans;
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
for(int i=0;i!=n;i++)
{
cin>>s;
cout<<read()<<endl;
}
}
return 0;
}
Problem D: 走迷宫 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 14 Solved: 2 [Submit][Status][Web Board] Description Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。
这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线。走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与最小难度值之差是最小的。当然了,或许这样的路径不是最短路径。
机器人卡多现在在迷宫的左上角(第一行,第一列)而出口在迷宫的右下角(第N行,第N列)。
卡多很聪明,很快就找到了这样的一条路径。你能找到吗?
Input 第一行: N 表示迷宫是N*N方阵 (2≤ N≤ 100)
接下来有N行, 每一行包含N个整数,用来表示每个单元格中难度 (0≤任意难度≤120)。
Output 输出为一个整数,表示路径上最高难度与和最低难度的差。
Sample Input 5 1 1 3 6 8 1 2 2 5 5 4 4 0 3 3 8 0 2 3 4 4 3 0 2 1 Sample Output 2