The Crime-solving Plan of Groundhog(大整数乘法)

题意:
0~9每个数字都给你一些,要求配成两个没有前导0的数字,使得乘积最小。

思路:
第二个数字为一个的时候乘积最小,所以直接模拟乘法。

#include 
#include 
#include 
#include 
#include 

using namespace std;
typedef long long ll;
const int maxn = 2e6 + 7;
const int mod = 998244353;

int vis[maxn];
struct Node {
    int id,x;
}a[maxn];

int cmp(Node a,Node b) {
    if(a.x == b.x) return a.id < b.id;
    return a.x < b.x;
}

int main() {
    int n,m;scanf("%d%d",&n,&m);
    int cnt = 0;
    for(int i = 1;i <= n;i++) {
        int amt;scanf("%d",&amt);
        for(int j = 1;j <= amt;j++) {
            int x;scanf("%d",&x);
            a[++cnt] = {i,x};
        }
    }
    sort(a + 1,a + 1 + cnt,cmp);
    
    int l = 1,now = 0;
    int ans = 1e9;
    for(int i = 1;i <= cnt;i++) {
        vis[a[i].id]++;
        if(vis[a[i].id] == 1) {
            now++;
            if(now >= m) {
                ans = min(ans,a[i].x - a[l].x);
            }
        }
        while(now >= m) {
            vis[a[l].id]--;
            if(vis[a[l].id] == 0) {
                now--;
            }
            l++;
            if(now >= m)
                ans = min(ans,a[i].x - a[l].x);
        }
    }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(#,大整数,#,其他比赛题目)