10.4 模拟赛

写在前面:

  我发现我每一次写题解都是改题改不出来了QAQ



  其实今天的题都还好啦。

T1 可见点数

  其实就是 luogu仪仗队 的数据扩大版,开个long long然后数组开大点就可以过了。

T2 射击

  这个题就很有意思了。

  小W和他的东厂厂长叔叔去打窗户。。。。

  其中两句话很有误导的含义,不少人都死在了这句话上面。【其实只有我 /滑稽

  每秒只能彻底打破一扇窗户。

  你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相同。

  错误的贪心策略:

    把所有的窗户按时间排序,时间相同按价值排序,然后模拟选择。

  实际上,很容易就能发现错误,比如下面这组数据:

    3

     1 10

    2 20

    2 20

  正确答案显然是40,但是上面这个做法却会使得答案变成30.

  问题就出在单位决策。

  那么怎么做呢?

  为了防止重复,我们先把时间从大到小排序,那么显然在主人先回来的窗户前面的窗可以在这之前的任何时间里打破。

  注意每次都要判断价值是否为负数,如果是非负数的话,那么我们就把这个点压入堆中,然后在它距离下一个时间点的时间里,我们可以在堆中取啊a[i].t-1-a[i+1].t个点,这些点就是最优策略。

代码放上:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
using namespace std;

const int maxn=200007;
int n;
struct ss{
    int tim,val;
    bool operator < (const ss &b) const{
        if(tim==b.tim)
            return val>b.val;
        return tim>b.tim;
    }
}win[maxn];
priority_queue<int> q;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&win[i].tim,&win[i].val);
    sort(win+1,win+n+1);
    ll ans=0;
    for(int i=1;i<=n;i++) {
        if(win[i].val<0)
            continue;
        q.push(win[i].val);
        for(int j=win[i+1].tim;j<=win[i].tim-1&&!q.empty();j++) {
            ans+=q.top();
            q.pop();
        }
    }
    cout<<ans<<endl;
    return 0;
}

T2 Code

T3 创世纪

   敬告啊敬告,考试的时候一定不要得意忘形QAQ

  本题有两种做法,环套树DP以及贪心。

  方法一:

    贪心相对来说,比较好想出来。

    随便画上几张比较正常的图来看,很容易发现,所有入度为0的点是肯定不能投放的。

    那么这些节点的儿子怎么看呢?

    可以分成两部分来看:

      1.环上。【为什么成环这种东西。。。显然吧

      2.环之间相连。

    那么,决策就显而易见了,

    为了尽可能投放更多的点,就把所有没有受到环限制的所有2类型的边全部投放。

    对于环上的点,则是环大小 / 2.

    同类的题还有 luogu消防局的设立

    本题代码放上

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn=1e6+7;
int n,ans;
int a[maxn],in[maxn];
int choic[maxn];
queue<int> q;

void px() {
    while(!q.empty()) {
        int x=q.front();
        q.pop();
        if(!choic[a[x]]) {
            choic[a[x]]=-1;//扔
            if(!--in[a[a[x]]]) {
                choic[a[a[x]]]=1;
                q.push(a[a[x]]);
            }
        }
    }
    return;
}

int get_h(int x,int cnt) {
    while(!choic[x]) {
        cnt++;
        choic[x]=2;//环上
        x=a[x];
    }
    return cnt/2;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        in[a[i]]++;
    }
    for(int i=1;i<=n;i++) {
        if(!in[i]) {
            choic[i]=1;//要保留
            q.push(i);
        }
    }
    px();
    for(int i=1;i<=n;i++) {
        if(choic[i])
            continue;
        ans+=get_h(i,0);
    }
    for(int i=1;i<=n;i++) {
        if(choic[i]==-1)
            ans++;
    }
    cout<<ans<<endl;
    return 0;
}

T3 Code

  方法二:

    关于基环树,点这里

    关于代码。。。

    我鸽了。。。


小结

  小结一下吧,今天的考试本应该能差不多的QAQ

  但是由于longlong,数组什么的问题 t1 和 t2 直接折半QAQ

  还有递归函数不熟练的最好不要不要传参,不然传的传的传出来的可能就不是你想要的了QAQ

  最后希望大家CSP RP++++++++++++

原文地址:https://www.cnblogs.com/qxyzili--24/p/11622702.html

时间: 2024-10-26 16:55:41

10.4 模拟赛的相关文章

10.2模拟赛总结

10.2 模拟赛总结 T1. 数位dp: 一个非常非常非常非常显然的数位 DP \([L,R] = [1,R]-[1,L-1]\) 所以是分别求两次小于等于某个数字的方案数 \(f(i,j,k)\) 表示从低位数起的第 \(i\) 位,按照规则计算后答案为 \(j\quad (j=0,1)\) \(k\) 表示只考虑后面结尾和 \(lmt\)后面几位 的大小关系 \((k=0,1)\) 考虑第 \(i+1\) 位,算一下新构成的数字并判断下大小就可以了 注意到 \(L,R\) 数据范围特别大,需

10.22 模拟赛

10.22 模拟赛 T1 染色 考虑每个连通块删成一棵树就好了. mmp场上就我路径压缩写炸.... #include<iostream> #define MAXN 200006 using namespace std; int n , m; int fa[MAXN] , siz[MAXN] , book[MAXN] , sz[MAXN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int main() {

10.31 模拟赛

10.31 模拟赛 A LIS 考虑每个数字前从 $ m $ 降序构造到 $ a_i $ 即可. #include <iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define MAXN 300006 int n , m , k; int A[MAXN]; vector<int&g

10.5模拟赛

这么多模拟赛都没整理,能整理一天算一天吧qaq T1题面 sol:应该不难吧,分别对横坐标和纵坐标取差的绝对值,易知:如果互质就可以看到,否则就不行.然后出题人很毒瘤要用unsigned long long. #include <cstdio> #include <algorithm> using namespace std; long long x1,y1,x2,y2,c1=0,c2=0; unsigned long long x,y; unsigned long long AB

10 01模拟赛订正

好吧,这是我第一次写模拟赛的订正,主要是有时间而且这次的题确实好... 第一题确实好,用的算法人人都会,就是看你能不能想到,我考只打了O(n^4)的暴力,最后还苦逼的MLE,爆零了... 暴力就不多说了...枚举两个点更新其他的点... 其实我考场上思考的是,能被标记的点都与其他的点有什么联系,可惜,除了模拟题目的做法,就不会了... 那让我们就认真地思考一发:我们设A(x1,x2),B(x2,c2),C(x3,c3)来更新D点,只有:有两个点横坐标相等,有两个点纵坐标相等,才可以更新出来一个新

2019.10.24模拟赛赛后总结

本文原创,如果有不到位的地方欢迎通过右下角的按钮私信我! A.Icow Player 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号.至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定: * 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000). * 当一首曲子播放完毕,接下来播放的

10.1 模拟赛

由于算错了inf 又ak失败了 过于菜 T1 年轮蛋糕 loj 2758 题目大意: n个数构成的环 把这个环分成三段 使最小的最大 求这个最小段的和的最大值 思路: 可以想到二分 因为log方可以过 所以可以二分长度后lower_bound找断点 或者使用滑动窗口 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cma

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm

17.2.10 NOIP模拟赛 藏妹子之处(excel)

藏妹子之处(excel) 问题描述: 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一行. (2)任意两个单元格都不在同一列. 选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|).狗狗想知道的是,花费在minT到maxT之间的方案数有多少. 答案模100000000