• hacker cup 2015 资格赛


    A:交换一个数的两位,问能得到最大和最小的数是多少。

    水题:

     1 // File Name: a.cpp
     2 // Author: darkdream
     3 // Created Time: 2015年01月10日 星期六 17时16分44秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 #define LL long long
    25 
    26 using namespace std;
    27 LL a[20];
    28 int T;
    29 LL SP(LL i , LL j, LL tmp)
    30 {
    31      int x =(tmp)/a[i] % 10 ; 
    32      int y =(tmp)/a[j] % 10 ;
    33      if(x == 0 && j == T)
    34          return tmp;
    35      return tmp - x * a[i] - y*a[j] + y *a[i] + x*a[j]; 
    36 }
    37 int count(LL tmp)
    38 {
    39   int num = 0 ; 
    40    while(tmp)
    41    {
    42      num ++;
    43      tmp/= 10;
    44    }
    45    return num ;
    46 }
    47 int main(){
    48    int t ;
    49    scanf("%d",&t);
    50    a[1] = 1; 
    51    for(int i = 2;i <= 13 ;i++)
    52    {
    53      a[i] = a[i-1]*10;
    54    }
    55    for(int ca = 1 ; ca <= t ;ca ++)
    56    {
    57       LL tmp;
    58       scanf("%lld",&tmp);
    59       LL mx = tmp;
    60       LL mi = tmp;
    61       T = count(tmp);
    62       for(int i = 1;i <= T;i ++)
    63           for(int j = i + 1;j <= T ;j ++)
    64           {
    65             LL now = SP(i,j,tmp);
    66             if(now > mx)
    67                 mx = now;
    68             if(now < mi)
    69                 mi = now;
    70           }
    71       printf("Case #%d: %lld %lld
    ",ca,mi,mx);
    72    }
    73 
    74 return 0;
    75 }
    View Code

    B:给你n件物品,每个物品都有三种属性值,问从中选取任意件,能不能使得最后得到确定值

    解题思路:二进制枚举

    解题代码:

     1 // File Name: b.cpp
     2 // Author: darkdream
     3 // Created Time: 2015年01月10日 星期六 17时55分37秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 #define LL long long
    25 
    26 using namespace std;
    27 int Ga,Gb,Gc;
    28 int a[30],b[30],c[30];
    29 bool solve(int k)
    30 {
    31    int t= 0 ; 
    32    int ta,tb,tc;
    33    ta = tb = tc = 0 ; 
    34    while(k)
    35    {
    36       if(k % 2)
    37       {
    38         ta += a[t];
    39         tb += b[t];
    40         tc += c[t];
    41       }
    42       k /= 2;
    43       t ++ ; 
    44    }
    45   //<F5> printf("%d %d %d
    ",ta,tb,tc);
    46    if(ta == Ga && tb == Gb&& tc == Gc)
    47    {
    48        return  1;
    49    }
    50    return 0 ; 
    51 }
    52 int main(){
    53   int T;
    54   scanf("%d",&T);
    55   for(int ca = 1;ca <= T; ca ++)
    56   {
    57       scanf("%d %d %d",&Ga,&Gb,&Gc);
    58       int n;
    59       scanf("%d",&n);
    60       for(int i= 0;i < n;i++)
    61       {
    62         scanf("%d %d %d",&a[i],&b[i],&c[i]);
    63       }
    64       int total = (1 << n)-1;
    65       int ok = 0 ; 
    66       for(int i =0 ;i <= total;i ++)
    67       {
    68          if(solve(i))
    69          {
    70            ok = 1; 
    71            break;
    72          }
    73       }
    74       if(ok)
    75         printf("Case #%d: yes
    ",ca);
    76       else printf("Case #%d: no
    ",ca);
    77   }
    78 return 0;
    79 }
    View Code

    C:给你一个网格图,其中每个网格中有墙,旋转的激光炮台,激光炮每秒旋转一次,问你最后从起点到终点最少能够几步到达

    解题思路:图只有4种情况,所以只需要把四种情况全部打表出来,没走一步状态就跟着变化就行

    解题代码:

      1 // File Name: c.cpp
      2 // Author: darkdream
      3 // Created Time: 2015年01月10日 星期六 20时10分04秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 
     26 using namespace std;
     27 int mp[5][105][105];
     28 int bex , bey ; 
     29 int enx,  eny ;
     30 int n , m; 
     31 int vis[105][105][105];
     32 void fillmap(int k )
     33 {
     34     for(int i = 1;i <= n;i ++)
     35     {
     36        for(int j = 1;j <= m ;j ++)
     37        {
     38           if(mp[k][i][j]  == 2) 
     39           {
     40             int x = i + 1; 
     41             while(mp[k][x][j] == 1 || mp[k][x][j] == -1)
     42             {
     43                    mp[k][x][j] = -1;
     44                 x ++ ; 
     45             }
     46           } else if(mp[k][i][j] == 3)
     47           {
     48             int x = i - 1; 
     49             while(mp[k][x][j] == 1 || mp[k][x][j] == -1)
     50             {
     51                    mp[k][x][j] = -1;
     52                 x -- ; 
     53             }
     54           } else if(mp[k][i][j] == 4)
     55           {
     56             int x = j + 1; 
     57             while(mp[k][i][x] == 1 || mp[k][i][x] == -1)
     58             {
     59                    mp[k][i][x] = -1;
     60                 x ++; 
     61             }
     62           }else if(mp[k][i][j] == 5)
     63           {
     64              int x = j -1; 
     65              while(mp[k][i][x] == 1 || mp[k][i][x] == -1)
     66              {
     67                 mp[k][i][x] = -1;
     68                 x --;
     69              }
     70           }
     71        }
     72     }
     73 }
     74 void print(int k )
     75 {
     76    for(int i = 1;i <= n;i ++)
     77    {
     78        for(int j = 1;j <= m ;j ++)
     79        {
     80           printf("%d ",mp[k][i][j]);
     81        }
     82        printf("
    ");
     83    }
     84    printf("
    ");
     85 }
     86 void changeto(int k )
     87 {
     88     for(int i = 1;i <= n;i ++)
     89     {
     90        for(int j = 1;j <= m;j ++)
     91        {
     92            if(mp[k-1][i][j] == 0)    
     93                mp[k][i][j] == 0;
     94            else if(mp[k-1][i][j] == 1)
     95                mp[k][i][j] = 1;
     96            else if(mp[k-1][i][j] == 2)
     97                mp[k][i][j] = 5;
     98            else if(mp[k-1][i][j] == 3)
     99                mp[k][i][j] = 4;
    100            else if(mp[k-1][i][j] == 4)
    101                mp[k][i][j] = 2;
    102            else if(mp[k-1][i][j] == 5)
    103                mp[k][i][j] = 3;
    104            else if(mp[k-1][i][j] == -1)
    105                mp[k][i][j] = 1;
    106        }
    107     }
    108     fillmap(k);
    109     //print(k);
    110 }
    111 struct node{
    112   int x,y,step,flag;
    113   node(){
    114   
    115   }
    116   node(int _x ,int _y ,int _step ,int _flag)
    117   {
    118      x = _x; 
    119      y = _y;
    120      step = _step;
    121      flag = _flag; 
    122   }
    123 }qu[101000];
    124 int xadd[] = {1,-1,0,0};
    125 int yadd[] = {0,0,-1,1};
    126 int bfs()
    127 {
    128     memset(vis,0,sizeof(vis));
    129     qu[1] = node(bex,bey,0,0);
    130     vis[0][bex][bey] = 1; 
    131     int l = 1; 
    132     int r = 1;
    133     while(l <= r)
    134     {
    135       // printf("%d %d
    ",qu[l].x,qu[l].y);
    136        if(qu[l].x == enx && qu[l].y == eny)
    137        {
    138              return  qu[l].step;
    139        }
    140        int k = (qu[l].flag + 1)%4; 
    141        for(int i = 0;i <= 3; i ++)
    142        {
    143            int tx = qu[l].x + xadd[i];
    144            int ty = qu[l].y + yadd[i];
    145            if(mp[k][tx][ty] == 1 &&  vis[k][tx][ty] != 1)
    146            {
    147               vis[k][tx][ty] = 1;
    148               r ++ ; 
    149               qu[r] = node(tx,ty,qu[l].step + 1, k);
    150            }
    151        }
    152        l ++ ; 
    153     }    
    154     return 0 ;
    155 }
    156 int main(){
    157     freopen("in.txt","r",stdin);
    158     freopen("out","w",stdout);
    159     int T;
    160     scanf("%d",&T);
    161     for(int ca = 1; ca <= T; ca ++)
    162     {
    163        scanf("%d %d",&n,&m);
    164        char str[1000];
    165        memset(mp,0,sizeof(mp));
    166        for(int i = 1;i <= n;i ++)
    167        {
    168           scanf("%s",&str[1]);
    169           for(int j = 1;j <= m;j ++)
    170           {
    171               if(str[j] == 'S') 
    172               {
    173                   bex = i ; 
    174                   bey = j ; 
    175                   mp[0][i][j] = 1;
    176               }else if(str[j] == 'G')
    177               {
    178                   mp[0][i][j] = 1;
    179                   enx = i ; 
    180                   eny = j;
    181               }else if(str[j] == '#')
    182               {
    183                   mp[0][i][j] = 0 ; 
    184               }else if(str[j] ==  '.')
    185                   mp[0][i][j] = 1 ;
    186               else if(str[j] == 'v')
    187                   mp[0][i][j] = 2; 
    188               else if(str[j] == '^')
    189                   mp[0][i][j] =3;
    190               else if(str[j] == '>')
    191                   mp[0][i][j] =4 ; 
    192               else if(str[j] == '<')
    193                   mp[0][i][j] =5;
    194           }
    195        }
    196           
    197           fillmap(0);
    198           changeto(1);
    199           changeto(2);
    200           changeto(3);
    201           //for(int i = 0 ;i <= 3;i ++ )
    202             //  print(i);
    203           int ok = bfs();
    204           printf("Case #%d: ",ca);
    205           if(ok == 0 )
    206               printf("impossible
    ");
    207           else printf("%d
    ",ok);
    208     }
    209 return 0;
    210 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    VGA线连接时,如果分辨率不高,可以换一根VGA线
    万里挑一好男人
    父进程有多个线程,fork()只会复制一个线程
    现在特别流行反向思维找对象:男生十不找
    jmeter + influxdb + Grafana (jmeter无界面压测查看数据)
    小工具很多的网站
    jmeter 逻辑控制器if
    测试工具OWASP(ZAP) (开源的)
    docker启一个mongodb
    adb wifi连接手机 + docker 启动appium环境 +实现连接多台设备
  • 原文地址:https://www.cnblogs.com/zyue/p/4239625.html
Copyright © 2020-2023  润新知