寒假每日一题总结(第十五天)

Posted 我是管小亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题总结(第十五天)相关的知识,希望对你有一定的参考价值。

文章目录

前言

今天是复习,总结一下这几天的题目和代码!!!

题目

第八天

博客

【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸

题解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;
const int N = 100005;

int n, m;
int h[N], w[N];

bool check(int mid)

    LL ans = 0;
    for (int i = 0; i < n; ++ i )
    
        ans += (LL)(h[i] / mid) * (w[i] / mid);
        if (ans >= m) return true;
    
    return false;


int main()

    cin >> n >> m;
    for (int i = 0; i < n; ++ i ) cin >> h[i] >> w[i];
    
    int l = 1, r = 1e5;
    while (l < r)
    
        int mid = l + r + 1 >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    
    cout << r << endl;
    
    return 0;

讲解

这个题是之前一个题的二维空间版本。

第九天

博客

【寒假每日一题】校门外的树(个人练习)详细题解+推导证明(第九天)

题解

#include <iostream>
#include <cstring>
#include <algorithm>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;
const int N = 110;

int n, m;
PII segs[N];

int main()

    cin >> n >> m;
    for (int i = 0; i < m; i ++ ) cin >> segs[i].x >> segs[i].y;
    sort(segs, segs + m);

    int sum = 0;
    int st = segs[0].x, ed = segs[0].y;
    for (int i = 1; i < m; i ++ )
        if (segs[i].x <= ed) 
            ed = max(ed, segs[i].y);
        else
        
            sum += ed - st + 1;
            st = segs[i].x, ed = segs[i].y;
        
    sum += ed - st + 1;
    cout << n + 1 - sum << endl;

    return 0;

讲解

讲道理,区间排序是一个很重要的算法,并且难了不会,会了不难。

第十天

博客

【寒假每日一题】奖学金(个人练习)详细题解+推导证明(第十天)

题解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 305;

int n;
struct Person

    int id, sum, a, b, c;
q[N];

int main()

    cin >> n;
    for (int i = 1; i <= n; ++ i )
    
        int x, y, z;
        cin >> x >> y >> z;
        q[i] = i, x + y + z, x, y, z;
    
    sort(q + 1, q + 1 + n, [](Person& x, Person& y)
        if (x.sum != y.sum) return x.sum > y.sum;
        if (x.a != y.a) return x.a > y.a;
        return x.id < y.id;
    );
    for (int i = 1; i <= 5; ++ i )
        cout << q[i].id << " " << q[i].sum << endl;
        
    return 0;

讲解

学会使用新版C++的特性,这会增加你的生产力。

第十一天

博客

【寒假每日一题】翻硬币(个人练习)详细题解+推导证明(第十一天)

题解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 105;

string a, b;

void turn(int i)

    if(a[i] == '*') a[i] = 'o';
    else a[i] = '*';


int main()

    cin >> a >> b;
    int ans = 0;
    for (int i = 0; i < a.size() - 1; ++ i )
        if (a[i] != b[i])
        
            ++ ans;
            turn(i), turn(i + 1);
        
    
    cout << ans << endl;
    return 0;

讲解

分析之后,你会发现从头到尾进行模拟,是时间复杂度的最优解。

第十二天

博客

【寒假每日一题】找硬币(个人练习)详细题解+推导证明(第十二天)

题解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100005;

int n, m;
int f[N];

int main()

    cin >> n >> m;
    for (int i = 0; i < n; ++ i ) cin >> f[i];
    sort(f, f + n);
    
    for (int i = 0, j = n - 1; i < j; ++ i )
    
        while (i < j && f[i] + f[j] > m) -- j;
        if (i < j && f[i] + f[j] == m)
        
            cout << f[i] << " " << f[j] << endl;
            return 0;
        
    
    puts("No Solution");
    return 0;

讲解

学会使用哈希表和双指针进行互相优化。

第十三天

博客

【寒假每日一题】十三号星期五(个人练习)详细题解+推导证明(第十三天)

题解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int months[13] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;
int weekdays[7];

int main()

    int n;
    cin >> n;
    
    int days = 0;
    for (int y = 1900; y < 1900 + n; ++ y )
    
        for (int m = 1; m <= 12; ++ m )
        
            weekdays[(days + 12) % 7] ++;
            days += months[m];
            if (m == 2)
                if ((y % 100 && y % 4 == 0) || (y % 400 == 0))
                    ++ days;
        
    
    
    for (int i = 5, j = 0; j < 7; i = (i + 1) % 7, ++ j )
        cout << weekdays[i] << " ";
    cout << endl;
    
    return 0;

讲解

需要注意的是输出,从周五开始。

第十三四

博客

【寒假每日一题】平方矩阵 II(个人练习)详细题解+推导证明(第十四天)

题解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 105;

int n;

int main()

    while (cin >> n, n)
    
        for (int i = 1; i <= n; ++ i )
        
            for (int j = i; j >= 1; -- j ) cout << j << " ";
            for (int j = i + 1; j <= n; ++ j ) cout << j - i + 1 << " ";
            cout << endl;
        
        cout << endl;
    
    
    return 0;

讲解

这种数学题,建议从一开始看到的最简单的方式去书写代码。

总结

继续努力,坚持更新,15th打卡。

唤醒鹿鸣,体验暖心陪伴

米哈游真的厉害

以上是关于寒假每日一题总结(第十五天)的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题奖学金(个人练习)详细题解+推导证明(第十天)

寒假每日一题回文平方(个人练习)详细题解+推导证明(第五天)

寒假每日一题总结(第七天)

寒假每日一题找硬币(个人练习)详细题解+推导证明(第十二天)

寒假每日一题货币系统(个人练习)详细题解+推导证明(第十七天)

寒假每日一题棋盘挑战(个人练习)详细题解+推导证明(第十六天)