首页 > 其他分享 >USACO2024DEC题解

USACO2024DEC题解

时间:2025-01-02 10:55:02浏览次数:1  
标签:cnt int 题解 sum ++ USACO2024DEC ans include

P11450 [USACO24DEC] Farmer John's Cheese Block B

//Farmer John's Cheese Block B
#include<stdio.h>
#include<iostream>
using namespace std;
int cnt_xy[1005][1005], cnt_yz[1005][1005], cnt_xz[1005][1005];

int main(){
    int n, q;
    int x, y, z;
    int ans = 0;
    cin >> n >> q;
    for(int i = 1; i <= q; i++){
        cin >> x >> y >> z;
        if(++cnt_xy[x][y] == n)     ans ++;
        if(++cnt_yz[y][z] == n)     ans ++;
        if(++cnt_xz[x][z] == n)     ans ++;
        cout << ans << endl;
    }
    return 0;
}

P11451 [USACO24DEC] It's Mooin' Time B

解题思路

  • 字符串模拟题,如果不考虑错误的话,那么只需要从头到尾扫一遍长度为3的字符串,利用map存储字符串出现的次数,判断是否大于\(f\)即可。

  • 但是本题中可能存在误差。因此如果出现的次数\(cnt >= f-1\)都有可能作为答案。

    在判断的时候需要分情况考虑

    1)当\(f>1\)时,能够作为答案的字符串\(s1\)一定原本已经在\(s\)中出现过。

    如果\(cnt>=f\)那么直接作为答案;

    如果\(cnt==f-1\)那么需要判断是否考虑误差之后,能够让出现的次数加一,处理方法如下

    • 记录原字符串中所有出现过\(s1\)的所有位置pos1

    • 记录若产生误差,能够出现\(s1\)的所有位置pos2

      对所有pos2,如果出现一个pos2不会和原字符串中的所有pos1发生冲突,即cnt可以加一,满足要求,可以作为答案。

    关于存储:建立两个map<int, vector>,\(mp1\)存储符合要求的字符串及所有出现的位置,\(mp2\)存储改过之后符合要求的字符串及所有出现的位置

    2)当\(f==1\)时,能够作为答案的字符串\(s1\)不一定在\(s\)中出现过。

    因此要遍历\(mp1\)以及\(mp2\),所有符合题目条件要求的都可以作为答案(要注意去重)

参考代码

//It's Mooin' Time B
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
map<string, vector<int> > mp, mp1;
string ans_str[1000005];

int main(){
    int n, f;
    string s, st, temp_s;
    cin >> n >> f;
    cin >> s;
    for(int i = 0; i < n - 2; i++){
        st = s.substr(i, 3);
        if(s[i] != s[i+1] && s[i+1] == s[i+2])      mp[st].push_back(i);
        for(int j = 0; j < 3; j++){
            string temp = st;
            for(int k = 0; k < 26; k++){
                temp[j] = 'a' + k;
                if(st[j] != temp[j] && temp[0] != temp[1] && temp[1] == temp[2])    mp1[temp].push_back(i);
            }
        }
    }
    int ans = 0;
    if(f > 1){
        for(auto it = mp.begin(); it!= mp.end(); it++){
            if(it->second.size() >= f)      ans_str[++ans] = it->first;
            else if(it->second.size() == f-1){
                //遍历一遍改过的map,如果有一个不会冲突的字符串位置,就可以
                for(int i = 0; i < mp1[it->first].size(); i++){
                    bool flag = 1;
                    for(int j = 0; j < it->second.size(); j++){
                        if(it->second[j] - 2 <= mp1[it->first][i] && mp1[it->first][i] <= it->second[j] + 2)
                            flag = 0;
                    }
                    if(flag){
                        ans_str[++ans] = it->first;
                        break;
                    }
                }
            }
        }
    }
    else{
        for(auto it = mp.begin(); it != mp.end(); it++){
            if(mp1[it->first].size() == 0)     ans_str[++ans] = it->first;
        }
        for(auto it = mp1.begin(); it != mp1.end(); it++)       ans_str[++ans] = it->first;
    }
    cout << ans << endl;
    sort(ans_str, ans_str + ans + 1);
    for(int i = 1; i <= ans; i++)       cout << ans_str[i] << endl;
    return 0;
}

P11452 [USACO24DEC] Cake Game S

解题思路

  • Bessie 和 Elsie的吃蛋糕最优策略:

    1)对于Bessie来说,一定不能将合并起来的蛋糕位置放在最左边或者最右边,不然会被Elsie吃掉。又因为Bessie只能合并相邻的连续的两个蛋糕,所以实际上Bessie能够吃掉的蛋糕最大值是被动的,取决于Elsie吃左边还是右边的蛋糕。

    一开始Bessie只能合并正中间的两个蛋糕(合并其他蛋糕后,都有可能被Elsie吃)

    当Elsie吃左边蛋糕,Bessie只能向右边合并,反之亦然。

    2)实际上,对于Elsie的最优决策为:求前缀和以及后缀和,枚举\(len(前缀和)+len(后缀和)=2/n-1\)的所有方案,求Elsie能够吃到的最大值,那么总和减去该最大值就是Bessie能够吃到的最大值

参考代码

```
//Cake Game S
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;
ll cake[500005];
ll sum_l[500005], sum_r[500005];

int main(){
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        memset(sum_l, 0, sizeof(sum_l));
        memset(sum_r, 0, sizeof(sum_r));
        for(int i = 1; i <= n; i++){
            cin >> cake[i];
            sum_l[i] = sum_l[i-1] + cake[i];
        }
        if(n == 2){
            cout << sum_l[n] << " " << 0 << endl;
            continue;
        }
        for(int i = n; i >= n/2+1; i--)     sum_r[i] = sum_r[i+1] + cake[i];
        int len = n / 2 - 1;
        ll e_ans = 0;
        for(int i = 0; i <= len; i++){
            e_ans = max(e_ans, sum_l[i] + sum_r[n/2+i+2]);
        }
        cout << sum_l[n] - e_ans << " " << e_ans << endl;
    }
    return 0;
}
```

## P11453 [USACO24DEC] Deforestation S

### 解题思路
树状数组+贪心

- 因为想要农场可以尽可能大,所以可以贪心地从前往后判断每一棵树,如果当前的树砍掉依然可以满足数量限制要求的话,那么就将当前树砍掉。

- 发现这道题的坐标值域为$[-10^9,10^9]$。如果用前缀和来维护树的数量状态,会发现值域太大无法处理。因此可以做离散化。并将所有的限制要求的值同样映射。因为树的坐标数组以及要求区间的坐标数组已经都排好序了,所以可以用双指针来实现区间数组的映射,其时间复杂度为$O(2n)$

- 在进行判断的时候,会发现如果当前树砍掉,会对所有包含该树的区间的值都发生改变。动态的修改以及查询可以使用树状数组实现,因此先建立一个树状数组维护区间内树的数量。判断时查询区间内树状数组的值。当前树可以砍掉的时候,修改树状数组。

标签:cnt,int,题解,sum,++,USACO2024DEC,ans,include
From: https://www.cnblogs.com/hsy2093/p/18647033

相关文章

  • [CF2353D] Refined Product Optimality 题解
    首先让我们输出的是不操作的值。不定序,一看就很贪心。经过分类分类分类可证,\(a,b\)都是升序(降序)的时候是最优的。再看加操作的。相当于要维护这两个升序序列。我们发现,每次操作影响的值很少,最多两个值。在一个连续段中,修改的值相当于和末尾值交换,再加一。唐点:找这个末尾没必要......
  • CF848E Days of Floral Colours 题解
    Problem-848E-Codeforces首先,由于整个图是对称的,所以我们将其沿直径分为两半,在算一半答案时把每一段的贡献平方再相加即可。(因为对面也有一段相同长度的也要计入贡献)现在我们的问题转化为了对于一个长为\(n\)的环,你可以给一个点连出一个线头(即在原图中连向对面的边)将其余......
  • Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [
    Paper-cutting:思维很好,但代码很构式的manacher题。蒟蒻2025年切的第一道题,是个紫,并且基本独立想出的,特此纪念。判断能否折叠我们先考虑一部分能折叠需要满足什么条件。显然,这一部分需要是一个长度为偶数的回文串。那么横向和纵向会不会影响呢?答案是不会,因为横向折了之后,折......
  • CF601E A Museum Robbery 题解
    题目传送门前置知识线段树与离线询问解法普通的回退背包无法处理本题中的删除操作,考虑线段树分治后转化为只进行添加的背包。具体实现时可以对每个深度开一个背包的转移数组,时间复杂度为\(O(nk\logq+qk)\),可以接受。代码#include<bits/stdc++.h>usingnamespacestd;#......
  • 洛谷 P11487 「Cfz Round 5」Gnirts 10——题解
    洛谷P11487「CfzRound5」Gnirts10传送锚点摸鱼环节「CfzRound5」Gnirts10题目背景Englishstatement.YoumustsubmityourcodeattheChineseversionofthestatement.InMemoryof\(\text{F}\rule{66.8px}{6.8px}\).题目描述题面还是简单一点好。给定......
  • 题解:AT_abc386_d [ABC386D] Diagonal Separation
    分析题面,发现题目求的是是否存在一个白点被\((1,1)\)和任意一个黑点围成的矩形内。先将所有黑点按\(x\)坐标排序。枚举所有的白点。找到所有横坐标不比该白点横坐标小的所有黑点的纵坐标的最大值所属点。如果该点的纵坐标小于该白点的纵坐标:(蓝点代表题目中的白点,红点......
  • 百丽宫24年春季真题题解——回型字符的打印
    不妨参考之前的一道选做题思路(虽然楼主自己之前也没找到时间做)但当时瞟过一眼题目,个人认为可以一起做,都是你中有我的关系,思路很相似。选做题摘录——晕:看着这样的"回”形图案你晕吗?让我们不用数组,来做出它。输入格式:n。正方形的边长输出格式:"%3d"   边长为n的数字回......
  • 百丽宫22年真题题解——最短路径(排列组合法)
    #include<stdio.h>unsignedlonglonghigh;unsignedlonglonglow;unsignedlonglongfac(intn,intm){unsignedlonglongi,f=1;if(m!=1){for(i=n;i>=n-m+1;i--){f=f*i;}returnf;}elseif(m......
  • 自动推理与规划:让机器具备智能决策与问题解决能力
    随着人工智能技术的不断进步,自动推理与规划(AutomatedReasoningandPlanning)已经成为使机器具备高效决策和问题解决能力的核心技术之一。它涉及如何通过逻辑推理、任务规划和约束求解,使机器能够自主地解决复杂问题、制定行动策略,并在不断变化的环境中做出最优决策。自动推理......
  • 题解:CF727F Polycarp's problems
    link。贪心做法。本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数。如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做。例如当前遍历到了\(50\),此时序列如下:\[\dots,50,-50,-10,-20\]易得我们\(50\)应该抵消的是\(-10,-20\),而不是前面的\(-50\),因为......