寒假CS每日打卡 Feb.8th


算法部分

1.Acwing 入门组每日一题
题目:不高兴的津津

津津上初中了。
妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。
另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。
但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。
假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。
请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入格式
输入文件包括七行数据,分别表示周一到周日的日程安排。
每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出格式
输出文件包括一行,这一行只包含一个数字。
如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。
如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

输入样例:
5 3
6 2
7 2
5 3
5 4
0 4
0 6
输出样例:
3

题解:
  现在入门组的题目越来越水了。

代码:

#include <iostream>

using namespace std;

int main(){
    
    
    int ans = 0, val = -1, a, b;

    for(int i = 1; i <= 7; i ++){
    
    
        cin >> a >> b;
        a += b;
        if(a > 8 && a > val)
            val = a, ans = i;
    }
    cout << ans << endl;
    return 0;
}

2.Acwing 提高组每日一题
题目:鱼塘钓鱼

有 N 个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N=5 时,如下表:
在这里插入图片描述
即:在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼,第 2 分钟内只能钓到 8 条鱼,……,第 5 分钟以后再也钓不到鱼了。
从第 1 个鱼塘到第 2 个鱼塘需要 3 分钟,从第 2 个鱼塘到第 3 个鱼塘需要 5 分钟,……
给出一个截止时间 T,设计一个钓鱼方案,从第 1 个鱼塘出发,希望能钓到最多的鱼。
假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。

输入格式
共 5 行,分别表示:
第 1 行为 N;
第 2 行为第 1 分钟各个鱼塘能钓到的鱼的数量,每个数据之间用一空格隔开;
第 3 行为每过 1 分钟各个鱼塘钓鱼数的减少量,每个数据之间用一空格隔开;
第 4 行为当前鱼塘到下一个相邻鱼塘需要的时间;
第 5 行为截止时间 T。

输出格式
一个整数(不超过231−1),表示你的方案能钓到的最多的鱼。

数据范围
1≤N≤100,
1≤T≤1000
输入样例:
5
10 14 20 16 9
2 4 6 5 3
3 5 4 4
14
输出样例:
76

题解:
  很值得做的一道题目。如果在鱼塘之间移动不需要花费时间,那么这道题是不是就是一道贪心呢,先把每个池塘的每分钟钓鱼数量加入大根堆中,然后每次取得堆顶元素,累加答案,然后减去每钓一次减少的数量,之后再加入大根堆中,这样子直到没有钓鱼时间。那么多了鱼塘之间的走动费用,上述方法还有效嘛,是可以的,因为移动费用只会使用一次,可以在第i鱼塘钓好了之后再跑到第i + 1个鱼塘,我们可是使用枚举来解决,枚举在前 1 个鱼塘、在前 2 个鱼塘 …在前n个鱼塘钓鱼的情况,然后取这些情况的最大值。

代码:

#include <iostream>
#include <queue>

using namespace std;

const int MAXN = 110;
int a[MAXN], b[MAXN], c[MAXN];
typedef pair<int, int> PII;

int main(){
    
    
    int n, m, ans = 0;

    cin >> n;

    for(int i = 1; i <= n; i ++)
        cin >> a[i];
    for(int i = 1; i <= n; i ++)
        cin >> b[i];
    for(int i = 1; i < n; i ++)
        cin >> c[i], c[i] += c[i - 1];

    cin >> m;
	//从只在第1个鱼塘钓鱼遍历到在所有n个鱼塘都钓鱼
    for(int i = 1; i <= n; i ++){
    
    
    	//预先减去走到鱼塘的时间花费,剩下的时间就可以都用来钓鱼
        int t = m - c[i - 1], res = 0;
        //按照每分钟钓鱼数量降序排列,因此队首就是在当前分钟能钓鱼的最大数量
        priority_queue<PII> Q;
		//加入i个鱼塘
        for(int j = 1; j <= i; j ++)
            Q.push({
    
    a[j], b[j]});    
		//当还有时间并且鱼塘非空
        while(t > 0 && !Q.empty()){
    
    
        	//取得队首
            PII tmp = Q.top();
            Q.pop();
            res += tmp.first;
            //钓鱼数量每钓一次会递减
            tmp.first -= tmp.second;
            if(tmp.first > 0)
                Q.push(tmp);
            //时间减 1
            -- t;
        }
        ans = max(ans, res);
    }
    cout << ans << endl;
    return 0;
}

3.LeetCode 每日一题
题目:最长湍流子数组

当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:
若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A 的最大湍流子数组的长度。

示例 1:
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])

示例 2:
输入:[4,8,12,16]
输出:2

示例 3:
输入:[100]
输出:1

提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9

题解:
  DP,dp[i][0] 代表第i个位置下降能得到的最长长度,dp[i][1]代表第i个位置上升能得到的最长长度,状态转移很容易求得。

代码:

class Solution {
    
    
public:
    int maxTurbulenceSize(vector<int>& arr) {
    
    
        int n = arr.size(), ans = 1;
        vector<vector<int>> dp(n, vector<int>(2, 1));

        for(int i = 1; i < n; i ++){
    
    
            if(arr[i] < arr[i - 1])
            	//当前位置下降就要求前面一个位置是上升的
                dp[i][0] = max(dp[i][0], dp[i - 1][1] + 1);
            else if(arr[i] > arr[i - 1])
            	//当前位置上升就要求前面一个位置是下降的
                dp[i][1] = max(dp[i][1], dp[i - 1][0] + 1);
            ans = max(ans, max(dp[i][0], dp[i][1]));
        }
        return ans;
    }
};

4.链表的中间结点
题目:

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
链表里的数在1到100之间

样例 1:
输入:1->2->3->4->5->null
输出:3->4->5->null

样例 2:
输入:1->2->3->4->5->6->null
输出:4->5->6->null

题解:
  考察数据结构,使用巧妙的快慢指针来解决,快指针比慢指针每次多移动一个节点,当快指针移动到结尾时,慢指针刚好指向中间位置。

代码:

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
    
    
public:
    ListNode * middleNode(ListNode * head) {
    
    
        ListNode *slow = head, *fast = head;
        
        while(true){
    
    
            if(fast && fast -> next)
                fast = fast -> next -> next;
            else
                break;
            slow = slow -> next;
        }
        
        return slow;
    }
};

书籍部分

None


PS.

  1. 阿里云-天池 在线编程平台较LeetCode来说简单一点,体验没有LeetCode好,不过可以拿来练习,里面也有周赛等活动 链接:https://tianchi.aliyun.com/oj

猜你喜欢

转载自blog.csdn.net/Raymond_YP/article/details/113763440