zoukankan      html  css  js  c++  java
  • abc196 abcd

    传送门

    A - Difference Max

      Given are integers abc, and d.
         We will choose integers x and y such that axb   and cyd. Find the maximum possible value of xy here.按题意输出最大的x-y 值即可, max(x-y) = max(x)-min(y)=b-c

            
    B - Round Down

      输入一个数,输出这个数向下取整得到的整数(n < 1e100), 当成字符串 输出小数点前的所有字符即可
    C - Doubled

      输入一个数,问小于这个数的符合条件整数的个数,条件是能分成两个相同的字符串 比如 1313 123123,(n <= 1e12), 所以最大的数为 599999 599999,直接枚举就行 当字符串相加得到的整数值超过 n 就break
    D - Hanjo

      给你一个H*W的方格图  A个1*2的板砖  B个1*1的板砖, 问有多少种方式填满方格图

    直接dfs就行 可以用二维数组表示格子是否已被覆盖 (0,0 ...... h-1,w-1)  也可以用一个数的二进制状态来表示, 比如说如果2这个格子已被覆盖的话 那对这个数进行 bit | (1<<2) 即可

    (H*W<= 16)

    0 1    2   3   4    5 ..... w-1

    w w+1 ............ ........2w-1

    2w ...........................3w-1

    ........................................

    ..... .........................h*w-1

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define _for(i,a,b) for(int i = (a); i < (b); i++)
    #define _rep(i,a,b) for(int i = (a); i <= (b); i++)
    #define all(v) (v).begin(), (v).end()
    #define nl "
    "
    #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())
    #define sz(v) ((int)(v).size())
    //#define LOCAL
    
    typedef long double ld;
    typedef long long ll;
    typedef unsigned long long ull;
    
    #ifdef LOCAL
    //#include "pretty_print.h"
    #define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__)
    #else
    #define dbg(...) 42
    #endif
    
    template <typename T> T sqr(T x) { return x * x; }
    template <typename T> T abs(T x) { return x < 0? -x : x; }
    template <typename T> T gcd(T a, T b) { return b? gcd(b, a % b) : a; }
    template <typename T> bool chmin(T &x, const T& y) { if (x > y) { x = y; return true; } return false; }
    template <typename T> bool chmax(T &x, const T& y) { if (x < y) { x = y; return true; } return false; }
    
    auto random_address = [] { char *p = new char; delete p; return (uint64_t) p; };
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1));
    mt19937_64 rngll(chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1));
    View Code
    void taskA() {
      int a,b,c,d; cin >> a >> b >> c >> d;
      cout << b-c;
      return;
    }
    void taskB() {
      string s; cin >> s;
      int n = s.size();
      for(auto c:s) {
        if(c == '.') break;
        cout << c;
       }
      return;
    }
    void taskC1() {
        int t;
        //cin >> t;
        t = 1;
        while(t--) {
            ll x1; cin >> x1;
            int ans = 0;
            const int N = 1e6+10;
            _for(i,0,N) {
                int x = 6;
                _for(j,0,7) if(pow(10,j) > i) { x = j; break;}
                if(1LL*i+1LL*i*pow(10,x) > x1) {
                    ans = i-1;
                    break;
                }
            }
            cout << ans;
        }
        return;
    }
    void taskC() {
        ll n; cin >> n;
        const int N = 1e6+10;
        _for(i,0,N) {
            if(stoll(to_string(i)+to_string(i)) > n)
            {
                cout << i-1; break;
            }
        }
        return;
    }
    int H,W,A,B,ans1;
    int vis[20][20];
    void dfs1(int x, int y, int a1, int b1) {// 0,0 ....  0,W-1  1,w.... H-1,W-1
        if(a1 < 0 or b1 < 0) return;
        if(y == W) x++, y = 0;// 行尾换个行
        if(x == H) return (void) ans1++;//代表从0,0  到 H-1,W-1 都满了
        if(vis[x][y]) return dfs1(x, y+1, a1, b1);
     
        vis[x][y] = 1;
        dfs1(x, y+1, a1, b1-1);
        if(y+1 < W and !vis[x][y+1]) {
            vis[x][y+1] = 1;
            dfs1(x, y+1, a1-1, b1);
            vis[x][y+1] = 0;
        }
        if(x+1 < H and !vis[x+1][y]) {
            vis[x+1][y] = 1;
            dfs1(x, y+1, a1-1, b1);
            vis[x+1][y] = 0;
        }
        vis[x][y] = 0;
        return;
    }
     
    void dfs(int s, int bit, int a1, int b1) {
        if(s == H*W) return (void) ans1++;
        if(bit & (1<<s)) return dfs(s+1, bit, a1, b1);//已被占用
        if(a1) {
            if(s%W < W-1) dfs(s+1, bit | (1<<s) | (1<<(s+1)), a1-1, b1);//不是行尾
            if((s+W) < H*W) dfs(s+1, bit | (1<<s) | (1<<(s+W)), a1-1, b1);//下一行还存在
        }
        if(b1) {
            dfs(s+1, bit | (1<<s), a1, b1-1);
        }
        return;
    }
    
    void taskD() {
        cin >> H >> W >> A >> B;//BF
        ans1 = 0;
        //dfs(0, 0, A, B);
        dfs1(0, 0, A, B);
        cout << ans1;
        return;
    }
    int main() {
        //ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
        taskD();
        //taskA();
    #ifdef LOCAL
        //assert(freopen("i.txt", "r", stdin));   assert(freopen("o.txt", "w", stdout));
        //freopen("i.txt", "r", stdin);   freopen("o.txt", "w", stdout);
        cerr << "Time execute: " << clock() / (double)CLOCKS_PER_SEC << " sec" << endl;
    #endif
        return 0;
    }
  • 相关阅读:
    (紫书,感谢作者)第7章暴力求解法
    明日更新
    明天更新
    UVa11882最大的数(dfs+剪枝)
    UVa12569树上的机器人的规划
    es6中的reduce方法?
    浏览器是如何渲染页面的?
    判断是不是一个数组?
    判断是否是一个数组?
    var与let的区别?
  • 原文地址:https://www.cnblogs.com/163467wyj/p/14683423.html
Copyright © 2011-2022 走看看