zoukankan      html  css  js  c++  java
  • A .Gaby And Addition (Gym

    题目链接:http://codeforces.com/gym/101466/problem/A

    题目:

    题意:

      给你n个数,重定义两个数之间的加法不进位,求这些数中两个数相加的最大值和最小值。

    思路:

      字典树。我们首先将前i-1为放入字典树中,然后在查询第i位时,我们去字典树中查询,对每一位进行寻找,找到满足题意的当前位的最大值和最小值,然后继续更新下一位,最后维护总的最大值和最小值即可。

    代码实现如下:

      1 #include <set>
      2 #include <map>
      3 #include <queue>
      4 #include <stack>
      5 #include <cmath>
      6 #include <bitset>
      7 #include <cstdio>
      8 #include <string>
      9 #include <vector>
     10 #include <cstdlib>
     11 #include <cstring>
     12 #include <iostream>
     13 #include <algorithm>
     14 using namespace std;
     15 
     16 typedef long long ll;
     17 typedef pair<ll, ll> pll;
     18 typedef pair<ll, int> pli;
     19 typedef pair<int, ll> pil;;
     20 typedef pair<int, int> pii;
     21 typedef unsigned long long ull;
     22 
     23 #define lson i<<1
     24 #define rson i<<1|1
     25 #define lowbit(x) x&(-x)
     26 #define bug printf("*********
    ");
     27 #define debug(x) cout<<"["<<x<<"]" <<endl;
     28 #define FIN freopen("D://code//in.txt", "r", stdin);
     29 #define IO ios::sync_with_stdio(false),cin.tie(0);
     30 
     31 const double eps = 1e-8;
     32 const int mod = 1e9 + 7;
     33 const int maxn = 1e6 + 7;
     34 const double pi = acos(-1);
     35 const int inf = 0x3f3f3f3f;
     36 const ll INF = 0x3f3f3f3f3f3f3f3f;
     37 
     38 int n;
     39 int le,root;
     40 int arr[20];
     41 ll num, pw[20];
     42 
     43 struct node{
     44     int nxt[10];
     45     void init(){
     46         for(int i = 0; i < 10; i++) nxt[i] = -1;
     47     }
     48 }T[13*maxn];
     49 
     50 void insert(ll x){
     51     int now = root;
     52     for(int i = 0; i <= 18; i++) {
     53         arr[i] = x % 10;
     54         x /= 10;
     55     }
     56     for(int i = 18;i >= 0; i--){
     57         int num = arr[i];
     58         if(T[now].nxt[num] == -1){
     59             T[le].init();
     60             T[now].nxt[num] = le++;
     61         }
     62         now = T[now].nxt[num];
     63     }
     64 }
     65 
     66 ll search1(ll x){
     67     int now = root, mx, idx;
     68     ll res = 0;
     69     for(int i = 0; i <= 18; i++) {
     70         arr[i] = x % 10;
     71         x /= 10;
     72     }
     73     for(int i = 18; i >= 0; i--) {
     74         mx = -1, idx = -1;
     75         for(int j = 0; j < 10; j++) {
     76             if(T[now].nxt[j] != -1 && (j + arr[i]) % 10 > mx) {
     77                 mx = (j + arr[i]) % 10;
     78                 idx = j;
     79             }
     80         }
     81         now = T[now].nxt[idx];
     82         res = res + mx * pw[i];
     83     }
     84     return res;
     85 }
     86 
     87 ll search2(ll x){
     88     int now = root, mx, idx;
     89     ll res = 0;
     90     for(int i = 0; i <= 18; i++) {
     91         arr[i] = x % 10;
     92         x /= 10;
     93     }
     94     for(int i = 18; i >= 0; i--) {
     95         mx = 11, idx = -1;
     96         for(int j = 0; j < 10; j++) {
     97             if(T[now].nxt[j] != -1 && (j + arr[i]) % 10 < mx) {
     98                 mx = (j + arr[i]) % 10;
     99                 idx = j;
    100             }
    101         }
    102         now = T[now].nxt[idx];
    103         res = res + mx * pw[i];
    104     }
    105     return res;
    106 }
    107 
    108 int main() {
    109     le = 1;
    110     pw[0] = 1;
    111     for(int i = 1; i <= 18; i++) pw[i] = pw[i-1] * 10;
    112     T[0].init();
    113     scanf("%d", &n);
    114     ll ans1 = INF, ans2 = -1;
    115     for(int i = 1; i <= n; i++) {
    116         scanf("%lld", &num);
    117         if(i > 1) {
    118             ans1 = min(search2(num), ans1);
    119             ans2 = max(search1(num), ans2);
    120         }
    121         insert(num);
    122     }
    123     printf("%lld %lld
    ", ans1, ans2);
    124     return 0;
    125 }
  • 相关阅读:
    在线教程的游戏化-20分钟做了个demo
    (转)内江师院网络专业大二学子实习快报
    学云网线下国信安教育走进川师大
    Ruby on Rails框架开发学习
    Unity3D编程学习分享
    后高考时代规划专家推荐 学云网“学历技能就业”
    Tomcat调优及JMX监控
    XenServer pool 移除server 设置master
    计算程序总行数的Python代码
    SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志
  • 原文地址:https://www.cnblogs.com/Dillonh/p/9503431.html
Copyright © 2011-2022 走看看