【题解】水题竞速 - 第一场

1 篇文章 0 订阅
1 篇文章 0 订阅
水题竞速-第一场【不知道有没有第二场】比赛链接: 点我进比赛注意:本场比赛是由岩巨亲自写的爬虫,把cf里面800分的题爬过来的【所以做过的也别见怪。。】目录:No.1 PuzzlesNo.2 Combination LockNo.3 One-dimensional Japanese CrosswordNo.4 Even Subset Sum ProblemNo.5 Bicycle ChainNo.6 Increasing SequenceNo.7 Tr.
摘要由CSDN通过智能技术生成

水题竞速-第一场【不知道有没有第二场】

比赛链接: 点我进比赛


注意:本场比赛是由岩巨亲自写的爬虫,把cf里面800分的题爬过来的【所以做过的也别见怪。。】


目录:


No.1 Puzzles (拼图)

题意:

在m个数中找出n个连续的数,使得这些数中的最大值和最小值得差最小。

代码

不说了,代码献上【这么水的题】

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n, m;
ll f[1005];
int main() {
    scanf("%lld %lld", &n, &m);
    for (int i = 0; i < m; i++) scanf("%lld", &f[i]); // 读入
    sort(f, f + m);    // 【重点】排序
    ll ans = 0x3f3f3f3f;
    for (int i = 0; i + n - 1 < m; i++) {     
        ans = min(ans, f[i + n - 1] - f[i]);     // 取框架(一个框架的长度为n)
    }
    cout << ans << endl;
    return 0;
}

代码过程如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8GhmfJxI-1603085161063)(/api/images/Qyu5b1594559673377.png)]


No.2 Combination Lock (密码锁)

题意:

就是算现在的锁和正确的密码之间至少要转多少次

思路

每一次都取最小值(一个反着转,一个正着转)

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
ll a[1005], b[1005];
string s;
ll ans = 0;
int main() {
    scanf("%lld", &n);
    cin >> s;
    for (int i = 0; i < n; i++) a[i] = s[i] - '0';    // 现在的锁的状况读入
    cin >> s;
    for (int i = 0; i < n; i++) b[i] = s[i] - '0';    // 密码读入
    for (int i = 0; i < n; i++) {
        ans += min(min(abs(9 - a[i]) + 1 + b[i], abs(9 - b[i]) + 1 + a[i]), abs(a[i] - b[i]));   // 【贪心】取最小值        
    }
    cout << ans << endl;
    return 0;
}

No.3 One-dimensional Japanese Crossword (一维日本字谜)

题意:

就是让你去算所有黑格子的个数【超简单】

思路

两个while循环,保证可以找完;答案存在vector里,节省空间【基本操作,不多说】

代码:

#include <bits/stdc++.h>
using namespace std;
int n;
string s;
int low = 0;
vector<int> p;
int main() {
    cin >> n;
    cin >> s;
    while(low < n) {
        int ans = 0;
        while(s[low] == 'B' && low < n) { // 直到找完一串黑格子
            ans++;
            low++;
        }
        if(ans != 0) p.push_back(ans); // 如果有黑格子,就把它放到答案里去
        low++;
    }
    if(p.size() == 0) cout << 0 << endl;
    else {
        cout << p.size() << endl;
        for (unsigned int i = 0; i < p.size() - 1; i++) cout << p[i] << ' '; // 输出
        cout << p[p.size() - 1] << endl;
    }
    return 0;
}

No.4 Even Subset Sum Problem (和为偶数的子序列问题)

题意:

给你一个数组a和一个数n,让你求出一个和为偶数的非空子序列

思路

一共有n个数,这些数中不是偶数就是奇数。然而题目中说可以是当个数为一个子序列,那么我们就可以找到一个偶数,就把他输出来。若没有偶数,剩下的全是奇数,因为 奇数+奇数=偶数,所以我们只要取它的前两个数就可以了,但是如果只有1个数,那么就无解了。

代码:

#include <bits/stdc++.h>
using namespace std;
int t, n;
int a[105];
vector<int> p;
int main() {
    cin >> t;
    while(t--) {
        cin >> n;
        bool flag = 1;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            if(flag == 1 && a[i] % 2 == 0) {                // 如果第一次出现偶数
                cout << 1 << endl << i + 1 << endl;         // 输出这个数
                flag = 0;                                   // 标记
            }
        }
        if(flag) {                                                  // 没有偶数时
            if(n != 1) cout << 2 << endl << 1 << " " << 2 << endl;  // 如果有多个数,就输出前两个数
            else cout << -1 << endl;                                // 没有这输出-1
        }
    }
    return 0;
}

No.5 Bicycle Chain (自行车链条)

题意:

给你前轮的链条a和后轮的链条b,让你求出 $ \frac{b_j}{a_i} $ 的最大整数值。

思路:

先找分数值整数的分数,然后再找最大值。

代码:

#include <bits/stdc++.h>
using namespace std;
int n, m;
int maxx = -1, ans = 0;
int a[10005], b[10005];
vector<int> p;
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    cin >> m;
    for (int i = 0; i < m; i++) cin >> b[i];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if(b[j] % a[i] == 0) {               // b[j] 是否是 a[i] 的倍数
                p.push_back(b[j] / a[i]);        // 把值放到vector里
                maxx = max(maxx, b[j] / a[i]);   // 取max
            }
        }
    }
    for (int i = 0; i < p.size(); i++) if(p[i] == maxx) ans++; //输出
    cout << ans << endl;
    return 0;
}

No.6 Increasing Sequence (递增序列)

题意:

给你两个数n, d和一个序列,每次增加d,,问至少要增加几次才能使序列成为递增序列。

思路:

算出前项与后项的差,再算出要加多少次d,然后模拟。

代码:

#include <bits/stdc++.h>
using namespace std;
int n, d;
int a[2005];
int ans = 0;
int main() {
    cin >> n >> d;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n; i++) {
        if(i > 0 && a[i - 1] >= a[i]) {                 // 是否要加
            ans += (a[i - 1] - a[i]) / d + 1;           // 要加多少次
            a[i] += ((a[i - 1] - a[i]) / d + 1) * d;    // 模拟
        }
    }
    cout << ans << endl;
    return 0;
}

No.7 Trace (痕迹)

题意:

计算同心圆的面积。

思路:

考虑奇偶性的不同计算方法。奇数个环时,用i对2取模,偶数个环时,用i+1对2取模。注意π的值要保留10位。

代码:

#include <bits/stdc++.h>
using namespace std;
#define PI 3.1415926536
int n;
double ans = 0;
int a[105];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    if(n % 2 == 0) {  // 偶数
        for (int i = n; i >= 1; i--) {
            if((i + 1) % 2) ans += (a[i] * a[i] - a[i - 1] * a[i - 1]) * PI;   // 用i+1对2取模
        }
    } else {          // 奇数
        for (int i = n; i >= 1; i--) {
            if(i % 2) ans += (a[i] * a[i] - a[i - 1] * a[i - 1]) * PI;         // 用i对2取模
        }
    }
    cout << fixed << setprecision(10) << ans << endl;
    return 0;
}

No.8 Permutation (排列)

题意:

问需要补(或改)多少个数才能使序列里面的元素为1~n。

思路:

先排序,再去重,然后检查序列。

代码:

#include <bits/stdc++.h>
using namespace std;
int a[5005], vis[5005];
int n, ans = 0;
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    sort(a, a + n);             // 排序
    int *t = unique(a, a + n);  // 去重
    for (int i = 0; i < t - a; i++) { // 标号
        vis[a[i]]++;
    }
    for (int i = 1; i <= n; i++) {    //检查有多少是遗漏的
        if(!vis[i]) ans++;
    }
    printf("%d\n", ans);        //输出
    return 0;
}

Tip: 本次比赛的题都比较简单,大家可以去做一做。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值