zoukankan      html  css  js  c++  java
  • 河南省第四届ACM程序设计大赛

    A: 序号互换

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    #include <iostream>
    #define INF 32768
    #define mod 1000000007
    #define ll long long
    using namespace std;
    
    int Getnum(char s[])
    {
        int i, sum=0;
    
        for(i=0; s[i]; i++)
            sum = sum*10 + s[i]-'0';
    
        return sum;
    }
    
    void Print(int num)
    {
        num--;
        if(num<26)
        {
            printf("%c", num+'A');
            return ;
        }
    
        Print(num/26);
    
        printf("%c", num%26+'A');
    }
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            char s[110];
    
            scanf("%s", s);
    
            if(s[0]>='0' && s[0]<='9')
            {
                int num = Getnum(s);
                Print(num);
                printf("
    ");
            }
            else
            {
                int sum=0;
    
                for(int i=0; s[i]; i++)
                    sum = sum*26 + s[i]-'A'+1;
    
                printf("%d
    ", sum);
            }
        }
        return 0;
    }
    View Code

     C: 表达式求值

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    #include <algorithm>
     
    using namespace std;
    #define met(a,b) (memset(a,b,sizeof(a)))
    const int N=550;
    #define INF 0x3f3f3f3f
     
    char s[N];
     
    int Find3(int x) ///找到当前括号匹配的,
    {
        int i, sum=0;
     
        for(i=x; s[i]; i++)
        {
            if(s[i]=='(')
                sum ++;
            if(s[i]==',')
            {
                sum --;
                if(sum==0)
                    return i;
            }
        }
    }
    int Find4(int x) ///找到,后的第一个)
    {
        int i;
     
        for(i=x; s[i]; i++)
            if(s[i]==')')
            return i-1;
    }
     
    int Getnum(int L, int R)
    {
        int i, sum=0;
     
        for(i=L; i<=R; i++)
            sum = sum*10 + s[i]-'0';
        return sum;
    }
     
    int Slove(int x)
    {
        int L=x+3, Index1, Index2, Lsum, Rsum;
     
        Index1 = Find3(x);
        Index2 = Find4(Index1);
     
        if(s[L+1]>='0' && s[L+1]<='9')
            Lsum = Getnum(L+1, Index1-1);
        else
            Lsum = Slove(L+1);
     
        if(s[Index1+1]>='0' && s[Index1+1]<='9')
            Rsum = Getnum(Index1+1, Index2);
        else
            Rsum = Slove(Index1+1);
     
        if(s[x]=='a')
            return Lsum+Rsum;
        if(s[x+1]=='a')
            return max(Lsum, Rsum);
        if(s[x+1]=='i')
            return min(Lsum, Rsum);
    }
     
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            int ans;
     
            scanf("%s", s);
     
            ans = Slove(0);
     
            printf("%d
    ", ans);
        }
        return 0;
    }
     
    /**
    22
    add(1,2)
    max(1,999)
    add(min(1,1000),add(100,99))
    add(min(1,1000),max(1,add(100,99)))
    */
     
    View Code
    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    //这个表达式求值,要先算最小单元的数值,可以采用递归方式
    
    char str[350]; //使用全局数据保存字符串
    int first;//字符当前位置
    
    int fun()  //函数,分析字符
    {
        int v,n;//保存数字及数字的位数
        switch(str[first])  //分析字符串的开头字符
        {
        case 'm':  //有可能是max,min
            first+=3;//指向括号
            if(str[first-2]=='i')//对于min
                return min(fun(),fun());  //如min(3,5),递归时就会分别返回3和5,然后当成min的参数
            else
                return max(fun(),fun());
            break;
    
        case 'a':  //是add
            first+=3;
            return fun()+fun();  //如add(3,5),递归时就会返回3和5
            break;
        case ',':  //分隔符
        case '(':
        case ')':
            first++;//跳过不处理
            return fun();//继续递归
            break;
        default:  //数字
            sscanf(str+first,"%d%n",&v,&n);//从字符str+first开始将数字读入v,数字位数为n
            first+=n;//走过数字
            return v;
            break;
    
        }
    
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);//n组测试数据
        while(n--)
        {
            scanf("%s",str);//字符数据
            cout<<fun()<<endl;
            first=0;//每次测试完要使first归零
        }
    
        return 0;
    }
    /**
    1000
    add(1,2)
    max(1,999)
    add(min(1,1000),add(100,99))
    add(min(1,1000),max(1,add(100,99)))
    */
    View Code

    D: 走迷宫

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    #define met(a,b) (memset(a,b,sizeof(a)))
    const int N=1100;
    #define INF 0x3f3f3f3f
    
    int n, flag;
    int a[N][N], vis[N][N];
    int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    
    void DFS(int x, int y, int Min, int Max)
    {
        if(x==n && y==n)
        {
            flag = 1;
            return ;
        }
        for(int i=0; i<4; i++)
        {
            int nx = x + dir[i][0];
            int ny = y + dir[i][1];
            if(nx>=1 && nx<=n && ny>=1 && ny<=n && a[nx][ny]>=Min && a[nx][ny]<=Max && !vis[nx][ny])
            {
                 vis[nx][ny] = 1;
                 DFS(nx, ny, Min, Max);
            }
            if(flag)
                return ;
        }
    }
    
    int Slove(int mid, int Min, int Max)
    {
        int i;
    
        for(i=Min; i<=Max-mid; i++)
        {
            if(a[1][1]<i || a[1][1]>i+mid) continue;
            if(a[n][n]<i || a[n][n]>i+mid) continue;
            flag = 0;
            met(vis, 0);
            vis[1][1] = 1;
            DFS(1, 1, i, i+mid);
            if(flag) return 1;
        }
        return 0;
    }
    
    
    int main()
    {
        while(scanf("%d", &n)!=EOF)
        {
            int i, j, Max=-INF, Min=INF;
    
            for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
            {
                scanf("%d", &a[i][j]);
                Max = max(Max, a[i][j]);
                Min = min(Min, a[i][j]);
            }
    
            int L=0, R=Max-Min, mid, w, ans=R;
            while(L<=R)
            {
                mid = (L+R)/2;
    
                w = Slove(mid, Min, Max);
                if(w)
                {
                    ans = min(ans, mid);
                    R = mid-1;
                }
                else L = mid+1;
            }
    
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    LeetCode 70
    LeetCode 81
    LeetCode 33
    LeetCode 78
    LeetCode 50
    LeetCode 34
    关于机器学习的学习笔记
    图的 DFS 与 BFS 复杂度分析
    Sqlalchemy的学习使用和常见问题
    mysql的使用和远程连接
  • 原文地址:https://www.cnblogs.com/YY56/p/5543006.html
Copyright © 2011-2022 走看看