18.9.18 考试总结

状态不好怎么办呢

今天考试我服了 第一题很简单但是我没想出来 幸好第二题数据比较水...我垃圾暴力都水过了

 

这道题倒着搞 正着搞其实是一样的 

因为要保证最后的珠子递增 所以就优先保证最后一个珠子放在空着的最后一个位置 其他的珠子就乱放就可以了

每次空着的位置减一下就可以了

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 5 * 1e5 + 5;
const ll MOD = 998244353;
ll ans,fac[N],rfac[N];
int n,num[N],sum;

ll fast_pow(ll a,ll b) {
    
    ll ans = 1;
    for(;b;b >>= 1,a = a * a % MOD)
        if(b & 1) ans = ans * a % MOD;
    return ans;
}

ll reverse(ll a) {
    
    return fast_pow(a,MOD - 2);
}

ll C(int i, int j) {
    
    return fac[i] * rfac[i - j] % MOD * rfac[j] % MOD;
}

void Init( ) {
    
    scanf("%d",& n);
    for(int i = 1;i <= n;i ++) {
        scanf("%d",& num[i]);
        sum += num[i];
    }
    fac[0] = 1,rfac[0] = 1;
    for(int i = 1;i <= 500000;i ++) {
        fac[i] = fac[i - 1] * i % MOD;
        rfac[i] = reverse(fac[i]);
    }
}

void Solve( ) {
    
    ans = 1;
    for(int i = n;i >= 1;i --) {
        ans = (ans * C(sum - 1,num[i] - 1)) % MOD;
        sum -= num[i];
    }
    printf("%lld",ans);
}

int main( ) {
    
    freopen("qiang.in","r",stdin);
    freopen("qiang.out","w",stdout);
    Init( );
    Solve( );
}

因为这个每一行的转移是一样的 所以和轮廓线dp一样的思路

然后使用矩阵快速幂加速转移 然后因为我一直都不是很会矩阵快速幂...

先高高冯dalao的代码把

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = (1<<4) + 2;
int n; ll mod;
inline ll moc(int a){return a >= mod ? a - mod : a;}
struct Maxtri{
    ll w[M][M];
    void unit(){
        for(int i = 0; i < M; i++)
            for(int j = 0; j < M; j++)
                w[i][j] = (i == j);
    }
    void init(){
        for(int i = 0; i < M; i++)
            for(int j = 0; j < M; j++)
                w[i][j] = 0;
    }
    void print(){
        for(int i = 0; i < M; i++){
            for(int j = 0; j < M; j++)printf("%d ", w[i][j]);puts("");
        }
            
    }
    
}tr;

Maxtri  operator *(const  Maxtri &s, const  Maxtri &t){
    Maxtri a;
    for(int i = 0; i < M; i++)
        for(int j = 0; j < M; j++){
            a.w[i][j] = 0;
            for(int k = 0; k < M; k++)
                a.w[i][j] = moc(a.w[i][j] + s.w[i][k] * t.w[k][j] % mod);
        }
    return a;
            
}

Maxtri ksm(Maxtri a, int b){
    Maxtri ret;
    for(ret.unit(); b; b >>= 1, a=a*a)
        if(b & 1) ret = ret * a;
    return ret;
}

void dfs(int dep, int os, int ns){
    if(!dep) {
        tr.w[ns][os] = 1;
        return ;
    }
    if((1<<(dep-1))&os){
        dfs(dep - 1, os, ns);
        if(dep - 1 > 0 && ((1<<(dep-2))&os)) dfs(dep - 2, os, ns + (1<<(dep-1)) + (1<<(dep-2)));
    }
    else dfs(dep - 1, os, ns + (1<<(dep-1)));
}


int main(){
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    int n;
    for(int i = 0; i < (1<<4); i++)
    dfs(4, i, 0);
    while(scanf("%d%lld", &n, &mod) == 2 && n && mod){
        Maxtri rec;
        rec.init();
        rec.w[(1<<4)-1][0] = 1;
        Maxtri ans = ksm(tr, n);
        //ans.print();
        ll res = ans.w[(1<<4)-1][(1<<4)-1];        
        printf("%lld\n", res);    
    }
    
}

这道题真的很神奇了

我感觉我至今还没有完全理解

先处理出一个数组表示从$a$到$b$需要多少次操作 如果某段区间内次数是单调递减的 说明这段区间的操作次数为最大的那个

处理出一个值表示将上一个位置的区间延展到现在的位置需要的代价 也是重新开几个次数的代价

因为我们要付出这个代价 就将当前区间的次数搞成4了 或者是当前的位置新开的代价

而我们每次选择最少钱的方案搞 所以如果小的在前面 它就相当于他那个位置补齐 否则是新加的 都能延展到这个位置

然后就每次选择一个最少的方案搞就可以了 (其实我也不是很理解 当以后更厉害了再来看)

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;
int n,T,ans,a[N],b[N],c[N],s[5];
bool vis[N];

void Solve( ) {
    
    scanf("%d",& T);
    while(T --) {
        scanf("%d",& n); ans = 0;
        for(int i = 1;i <= n;i ++) scanf("%d",& a[i]);
        for(int i = 1;i <= n;i ++) scanf("%d",& b[i]);
        for(int i = 1;i <= n;i ++) {
            if(b[i] == a[i]) c[i] = 0;
            else if(b[i] > a[i]) c[i] = b[i] - a[i];
            else c[i] = b[i] + 4 - a[i];
        }
        memset(s,0,sizeof(s));
        ans = c[1];
        for(int i = 2;i <= n;i ++) {
            s[((c[i] - c[i - 1]) % 4 + 4) % 4] ++;
            if(c[i] <= c[i - 1]) continue;
            int j;
            for(j = 1;s[j] == 0;j ++);
            s[j] --;
            ans += j;
        }
        printf("%d\n",ans);
    }
}

int main( ) {
    
    freopen("sequence.in","r",stdin);
    freopen("sequence.out","w",stdout);
    Solve( );
}

 

转载于:https://www.cnblogs.com/Rubenisveryhandsome/p/9670122.html

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值