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<bits/stdc++.h> 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<bits/stdc++.h> #define ll long long using namespace std; int n; string f; void getblack() { char c=cin.peek(); if(c==EOF)return ; while(c==' '||c=='\n'||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<bits/stdc++.h> using namespace std; int n; string s; stack<int> 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