河南省第四届大学生程序设计竞赛

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

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

  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
#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

文章目录