2021牛客暑期多校训练营5补题目记录

Greater Integer, Better LCM

#include<bits/stdc++.h>
#define ll long long
#define N 200
#define FOR(i,n,m) for(int i=n;i<=m;i++)
#define For(i,n,m) for(int i=n;i>=m;i--)
using namespace std;
int n;
int p[N],q[N];
__int128 f[N][N],s[N];
__int128 a,b,ans;
inline void read(__int128 &X)
{
    X = 0;
    int w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    if (w) X = -X;
}
inline void print(__int128 x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
void dfs(int k,__int128 A,__int128 B)
{
    if((A-a)+(B-b)>ans)return;
    if(A*s[k]<a||B*s[k]<b)return;
    if(k>n)
    {
        if(A<a||B<b)return;
        ans=min(ans,A-a+B-b);
        return;
    }
    FOR(i,0,q[k]-1)
    {
        dfs(k+1,A*f[k][q[k]],B*f[k][i]);
        dfs(k+1,A*f[k][i],B*f[k][q[k]]);
    }
    dfs(k+1,A*f[k][q[k]],B*f[k][q[k]]);
}
int main()
{
    cin>>n;
    FOR(i,1,n)
        std::cin>>p[i]>>q[i];
    read(a);read(b);
    FOR(i,1,n)
    {
        f[i][0]=1;
        FOR(j,1,q[i])
            f[i][j]=f[i][j-1]*p[i];
    }
    s[n+1]=1;
    For(i,n,1)
        s[i]=s[i+1]*f[i][q[i]];
    ans=(__int128)1e30;
    dfs(1,1,1);
    print(ans);
    return 0;
}

Jewels

#include<bits/stdc++.h>
using namespace std;
const int N = 610, M = 1000010;
int n, m;
long long value[510][510];
int c[510];
int c1[510];
long long la[510], lb[510];
long long update[510], min1;
int pre[510];
void bfs(int x) {
    int last = 0, ff = 0, now;
    memset(pre, 0, sizeof(pre));
    for (int i = 0; i <= n; i++)update[i] = 1e18;
    c1[last] = x;
    while (1) {
        c[last] = 1;
        min1 = 1e18;
        now = c1[last];
        for (int i = 1; i <= n; i++) {
            if (!c[i]) {
                if (update[i] > la[now] + lb[i] - value[now][i]) {
                    update[i] = la[now] + lb[i] - value[now][i];
                    pre[i] = last;
                }
                if (update[i] < min1)min1 = update[i], ff = i;
            }
        }
        for (int i = 0; i <= n; i++) {
            if (c[i])la[c1[i]] -= min1, lb[i] += min1;
            else update[i] -= min1;
        }
        last = ff;
        if (c1[last] == -1)break;
    }
    while (last)c1[last] = c1[pre[last]], last = pre[last];
}
void km() {
    memset(c1, -1, sizeof(c1));
    for (int i = 1; i <= n; i++) {
        memset(c, 0, sizeof(c));
        bfs(i);
    }
}
long long x[310], y[310], z[310], v[310];
signed main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%lld%lld%lld%lld", &x[i], &y[i], &z[i], &v[i]);
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            value[i][j] = -1e18;
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            long long k = x[i] * x[i] + y[i] * y[i] + (z[i] + v[i] * (j - 1)) * (z[i] + v[i] * (j - 1));
            value[i][j] = -k;
        }
    }
    km();
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        if (c1[i] != -1)ans += value[c1[i]][i];
    }
    printf("%lld\n", -ans);
    return 0;
}
全部评论

相关推荐

程序员鼠鼠_春招版:我要12k吧我挂了,还招呢,天天被割,这点钱都不舍得出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务