AtCoder Beginner Contest 208

AtCoder Beginner Contest 208

A - Rolling Dice

题意:

题解:

代码:

#include <bits/stdc++.h>

#define int long long
#define debug(x) cout << #x << " = " << x << endl;
using namespace std;

int const MAXN = 2e5 + 10;
int n, m, T, a[MAXN];
int A, B;

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> A >> B;
    int low = A;
    int up = A * 6;
    if (low <= B && B <= up) puts("Yes");
    else puts("No");
    return 0;
}

B - Factorial Yen Coin

题意:

题解:

代码:

#include <bits/stdc++.h>

#define int long long
#define debug(x) cout << #x << " = " << x << endl;
using namespace std;

int const MAXN = 2e5 + 10;
int n, m, T, a[MAXN];
int get(int x) {
    int res = 1;
    for (int i = 1; i <= x; ++i) res *= i;
    return res;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    int cnt = 0;
    for (int i = 10; i >= 1; --i) {
        cnt += n / get(i);
        n %= get(i);
    }
    cout << cnt;
    return 0;
}

C - Fair Candy Distribution

题意:

题解:

代码:

#include <bits/stdc++.h>

#define int long long
#define debug(x) cout << #x << " = " << x << endl;
using namespace std;

int const MAXN = 2e5 + 10;
int n, m, T;
typedef pair<int, int> PII;
PII a[MAXN];

bool cmp(PII x, PII y) {
    return x.second < y.second;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i].first;
        a[i].second = i;
    }
    sort(a + 1, a + 1 + n);
    int avg = m / n;
    int remain = m % n;
    for (int i = 1; i <= n; ++i) {
        if (i <= remain) a[i].first = avg + 1;
        else a[i].first = avg;
    }
    sort(a + 1, a + 1 + n, cmp);
    for (int i = 1; i <= n; ++i) cout << a[i].first << endl;
    return 0;
}

D - Shortest Path Queries 2

题意: 有一张n个点m条边的有向图,定义 f ( s , t , k ) f(s,t,k) f(s,t,k) 为从s到t点,只在前1 ~ k个点之间流转的路径的最小长度。现在要你计算 ∑ s = 1 N ∑ t = 1 N ∑ k = 1 N f ( s , t , k ) \sum_{s=1}^N\sum_{t=1}^N\sum_{k=1}^Nf(s, t, k) s=1Nt=1Nk=1Nf(s,t,k)。 数据范围 1 < = n < = 400 , 0 < = m < = n ∗ ( n − 1 ) 1<=n<=400,0<=m<=n*(n-1) 1<=n<=400,0<=m<=n(n1)

题解: n是400,第一眼看过去应该就会想到Floyd。考虑floyd的过程,第一个循环for (int k = 1; k <= n; ++k),这个循环决定了对于任意的i和j之间的转移,只经过当前的k来更新,因此当k从1 ~ n的过程,也就是使得i -> j之间的转移只通过1 ~ k的来流转的最短路,那么符合题目的定义。因此对于每一个k变化的时候,都更新下答案即可。

代码:

#include <bits/stdc++.h>

#define int long long
using namespace std;

int const N = 410, INF = 0x3f3f3f3f3f3f3f3f;
int mp[N][N], n, m, k;

// floyd求最短路
int floyd() {
    int res = 0 ;
    for (int k = 1; k <= n; ++k) {
        for (int i = 1; i <= n; ++i)  // 枚举起点
            for (int j = 1; j <= n; ++j)  // 枚举终点
                mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);  // 更新i到j的距离
        for (int i = 1; i <= n; ++i) 
            for (int j = 1; j <= n; ++j) 
                if (mp[i][j] < 1e9) res += mp[i][j];
    }
    return res;
}

signed main() {
    cin >> n >> m;  // 点、边、询问次数
    
    // 初始化距离:初始化为正无穷
    for (int i = 1; i <= n; ++i) 
        for (int j = 1; j <= n; ++j) 
            mp[i][j] = (i == j? 0: INF);  
            
    // 读入边
    for (int i = 1, a, b, c; i <= m; ++i) {
        scanf("%lld%lld%lld", &a, &b, &c);
        mp[a][b] = min(mp[a][b], c);
    }
    
    // 求最短路
    cout << floyd();
    
    return 0;
}

E - Digit Products

题意: 计算[1, N]中有多少数字的数位乘积小于等于K。 1 < = N < = 1 e 18 , 1 < = K < = 1 e 9 1<=N<=1e18,1<=K<=1e9 1<=N<=1e18,1<=K<=1e9

题解: 本题需要考虑乘积,有18位,乘积的数字很大,但是状态数目不会很多(自己打了个表发现状态数只有36101个),因此直接把状态离散化。同时,需要考虑前导0的影响。然后直接按照数位dp转移即可。

代码:

#include <bits/stdc++.h>

#define int long long
#define debug(x) cout << #x << " = " << x << endl;
using namespace std;

int const MAXN = 20;
int n, k, a[MAXN], dp[MAXN][36110], len, idx;
unordered_map<int, int> H;

int mapping(int x) {
    if (!H.count(x)) H[x] = ++idx;
    return H[x];
}   

int dfs(int pos, int lead, int sum, int limit) {  // lead维护前导0,sum维护乘积
    if (!pos) return sum <= k;
    if (!limit && !lead && dp[pos][mapping(sum)] != -1) return dp[pos][mapping(sum)];  // 因为乘积总数少,所以离散化
    int res = 0;
    int up = limit? a[pos]: 9;
    for (int i = 0; i <= up; ++i) {
        if (lead) res += dfs(pos - 1, lead && !i, max((int)1, i), limit && i == up);  // 需要考虑前导0带来的影响
        else res += dfs(pos - 1, lead && !i, sum * i, limit && i == up);
    }
    if (!limit && !lead) dp[pos][mapping(sum)] = res;
    return res;
}

int solve(int x) {
    len = 0;
    while(x) a[++len] = x % 10, x /= 10;
    return dfs(len, 1, 1, 1);
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> k;
    memset(dp, -1, sizeof dp);
    cout << solve(n) - 1;
    return 0;
}

状态数目打表代码:

#include <bits/stdc++.h>

#define int long long
#define debug(x) cout << #x << " = " << x << endl;
using namespace std;

int const MAXN = 2e5 + 10;
int n, m, T, a[MAXN];
unordered_map<int, int> exist[20];
int ans;

void dfs(int pos, int sum) {
    if (exist[pos][sum]) return;
    exist[pos][sum] = 1;
    if (pos == 18) {
        ans ++;
        return;
    }
    for (int i = 0; i <= 9; ++i) dfs(pos + 1, sum * i);
    return;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    dfs(0, 1);
    cout << ans << endl;
    return 0;
}

F - Cumulative Sum

题意: 阴间拉格朗日插值,题解看了半天,还是不会,鸽了

题解:

代码:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值