UVA 1262 Password (水题)

    xiaoxiao2021-03-31  38

    大体题意:

    给你两个6行5列的数字矩阵,要求从每一列中选出一个字符来,使得两个矩阵中对应的列都存在,输出第k 小的密码。

    思路:

    数据量太小了。

    直接预处理出来每一列的合法字符,然后根据乘法原理,一步一步接近k 即可。

    有个坑:

    就是每一列可能有重复字符,要去重,这根据输出就可以晓得它的实际性。

    #include <cstdio> #include <cstring> #include <algorithm> #include <set> #define Siz(x) (int)x.size() using namespace std; int T, k; char s1[7][7]; char s2[7][7]; set<int>g[7]; set<int>::iterator it; inline bool check(int ch,int col){ for (int i = 0; i < 6; ++i){ if (s2[i][col] == ch) return 1; } return 0; } int sum[7]; int main(){ // freopen("out.txt","w",stdout); scanf("%d",&T); while(T--){ scanf("%d",&k); for (int i = 0; i < 7; ++i)g[i].clear(); for (int i = 0; i < 6; ++i) scanf("%s",s1[i]); for (int i = 0; i < 6; ++i) scanf("%s",s2[i]); for (int i = 0; i < 6; ++i){ for (int j = 0; j < 5; ++j){ if (check(s1[i][j],j)) g[j].insert(s1[i][j]); } } int cur = 0; sum[5] = 1; for (int i = 4; i >= 0; --i){ sum[i] = sum[i+1] * Siz(g[i]); } if (k > sum[0]) { puts("NO"); continue; } for (int i = 0; i < 5; ++i){ for (it = g[i].begin(); it != g[i].end(); ++it){ if (cur + sum[i+1] < k){ cur += sum[i+1]; } else break; } putchar(*it); } putchar('\n'); } return 0; } /** 3 1 AYGSU DOMRA CPFAS XBODG WDYPK PRXWO CBOPT DOSBG GTRAR APMMS WSXNU EFGHI **/

    转载请注明原文地址: https://ju.6miu.com/read-665350.html

    最新回复(0)