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设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

  1. 一个正的十进制数 x 是一个表达式。

  2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

  3. 如果 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