zoukankan      html  css  js  c++  java
  • [hdu5218]DP-约瑟夫环变形

    题意:n个人围成一圈,另外一个人最开始站在第一个人前面,每次从集合s里面随机选一个数x,这个人顺时针经过x个人后停下来,当前位置的前一个人出队,然后继续进行,求最后剩下的那个人的可能编号。

    思路:由于只求最后一个人的编号,可以将一次操作后的人进行重编号,来进行状态转移,转化为子问题用dp来解决。dp方程比较容易写出,注意下细节就好了。

      1 #pragma comment(linker, "/STACK:102400000,102400000")
      2 
      3 #include <iostream>
      4 #include <cstdio>
      5 #include <algorithm>
      6 #include <cstdlib>
      7 #include <cstring>
      8 #include <map>
      9 #include <queue>
     10 #include <deque>
     11 #include <cmath>
     12 #include <vector>
     13 #include <ctime>
     14 #include <cctype>
     15 #include <set>
     16 #include <bitset>
     17 #include <functional>
     18 #include <numeric>
     19 #include <stdexcept>
     20 #include <utility>
     21 
     22 using namespace std;
     23 
     24 #define mem0(a) memset(a, 0, sizeof(a))
     25 #define mem_1(a) memset(a, -1, sizeof(a))
     26 #define lson l, m, rt << 1
     27 #define rson m + 1, r, rt << 1 | 1
     28 #define define_m int m = (l + r) >> 1
     29 #define rep_up0(a, b) for (int a = 0; a < (b); a++)
     30 #define rep_up1(a, b) for (int a = 1; a <= (b); a++)
     31 #define rep_down0(a, b) for (int a = b - 1; a >= 0; a--)
     32 #define rep_down1(a, b) for (int a = b; a > 0; a--)
     33 #define all(a) (a).begin(), (a).end()
     34 #define lowbit(x) ((x) & (-(x)))
     35 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
     36 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
     37 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
     38 #define pchr(a) putchar(a)
     39 #define pstr(a) printf("%s", a)
     40 #define sstr(a) scanf("%s", a)
     41 #define sint(a) scanf("%d", &a)
     42 #define sint2(a, b) scanf("%d%d", &a, &b)
     43 #define sint3(a, b, c) scanf("%d%d%d", &a, &b, &c)
     44 #define pint(a) printf("%d
    ", a)
     45 #define test_print1(a) cout << "var1 = " << a << endl
     46 #define test_print2(a, b) cout << "var1 = " << a << ", var2 = " << b << endl
     47 #define test_print3(a, b, c) cout << "var1 = " << a << ", var2 = " << b << ", var3 = " << c << endl
     48 
     49 typedef long long LL;
     50 typedef pair<int, int> pii;
     51 typedef vector<int> vi;
     52 
     53 const int dx[8] = {0, 0, -1, 1, 1, 1, -1, -1};
     54 const int dy[8] = {-1, 1, 0, 0, 1, -1, 1, -1 };
     55 const int maxn = 2e2 + 7;
     56 const int md = 10007;
     57 const int inf = 1e9 + 7;
     58 const LL inf_L = 1e18 + 7;
     59 const double pi = acos(-1.0);
     60 const double eps = 1e-6;
     61 
     62 template<class T>T gcd(T a, T b){return b==0?a:gcd(b,a%b);}
     63 template<class T>bool max_update(T &a,const T &b){if(b>a){a = b; return true;}return false;}
     64 template<class T>bool min_update(T &a,const T &b){if(b<a){a = b; return true;}return false;}
     65 template<class T>T condition(bool f, T a, T b){return f?a:b;}
     66 template<class T>void copy_arr(T a[], T b[], int n){rep_up0(i,n)a[i]=b[i];}
     67 int make_id(int x, int y, int n) { return x * n + y; }
     68 
     69 int p[maxn], f[maxn][maxn], ans[maxn];
     70 int main() {
     71     //freopen("in.txt", "r", stdin);
     72     int T, n, m;
     73     cin >> T;
     74     while (T--) {
     75         cin >> n >> m;
     76         rep_up0(i, m) {
     77             sint(p[i]);
     78         }
     79         mem0(f);
     80         f[n][0] = true;
     81         for (int i = n - 1; i; i --) {
     82             for (int j = 0; j < n - i + 1; j ++) {
     83                 rep_up0(k, m) {
     84                     if ((p[k] + n - i) % (n - i + 1) == j) continue;
     85                     int sta, tmp = p[k] % (n - i + 1);
     86                     if (j >= tmp) sta = j - tmp;
     87                     else sta = n - i + 1 - tmp + j;
     88                     f[i][j] = f[i][j] || f[i + 1][sta];
     89                 }
     90             }
     91         }
     92         int cnt = 0;
     93         rep_up0(i, n) {
     94             if (f[1][i]) ans[cnt ++] = i + 1;
     95         }
     96         cout << cnt << endl;
     97         rep_up0(i, cnt) {
     98             printf("%d%c", ans[i], i == cnt - 1? '
    ' : ' ');
     99         }
    100     }
    101     return 0;
    102 }
    View Code
  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/jklongint/p/4486602.html
Copyright © 2011-2022 走看看