2019.10.8 题解报告

目录

  • 2019.10.8 题解报告
    • 时间安排:
    • 答题情况:
    • 题目解析:
    • 代码实现:

2019.10.8 题解报告

今天 没有题解= =
所以题目解析只能口胡
另外关于 T3的 扫描线 我并不会写= =

时间安排:

  • T1: 8:00~9:20 T2: 9:30~9:40 T3: 9:50~10:30

    • T1 神题 , 30分钟打完部分分 , 5分钟打完暴力 ,
      一直对拍 , 发现暴力跑得比部分分还快
      后来发现 暴力的复杂度 非常对 , 显然就是标算.
      题意 有个地方不太清晰 ,最后决定蒙一下 , 本来能A ,但是蒙错了情况= =
    • T2 整个题面透露出一种超简单板子题的气息 , 要么是水题要么是神仙题 ,
      实在 没看出哪里神仙 , 决定打板子
    • T3 真正的神仙题 , 十分不可做 , 但是70分 "比较" 好打
    • 最后30分钟 对各代码进行了微调 ,

答题情况:

  • T1: 60 T2:20 T3:70

题目解析:

T1:

知识点: 模拟 , 暴力

使用优先队列 , 记录 正在吃的鱼 的 吃完时间 与 吃它的猫的速度
重载 结构体运算符 , 使优先队列中元素
按照 第一关键字 时间升序 , 第二关键字速度升序 进行排序

每一只猫 都在0时刻 获得一条鱼
则 先初始化 , 优先队列中的元素 ,

之后 循环枚举 优先队列中的元素
如果 队首的鱼 吃完时间 <= 限制时间
那么 吃完的鱼数 ++

若 队首的鱼 吃完之后 还有鱼 ,
那么就再给 吃这条鱼的猫 一条新的鱼
向优先队列中 加入一 新的元素

特别的 , 当到达限制时刻 时 ,
不可以 再开始吃一条新的鱼


T2:

(口胡)
先考虑 小数据范围内的 情况:

若 两相邻的 物品 a,b
有 qa-pa < qb-pb
则 将b物品 顺序放在后面 一定不会更差

则可以先将各物品进行排序
之后 跑01背包即可


T3:

70%数据:

发现此题 与 之前的 一bfs例题很相似
都是 给定一 平面图形 , 计算 其面积
可以将思路向bfs上 靠近

对于题目给出的 修改操作 ,
暴力进行修改 , 并在 图中进行标记

修改时 , 同时维护一个
包含所有 修改区域的 最小子矩阵 , 便于之后进行搜索

之后 从子矩阵 外围出发 , 开始bfs染色
如果 相邻的位置 没有被标记 , 那就转移并且染色
否则 返回

最后发现 , 没有被染色区域的 面积
即为题目所求

100%(口胡)

发现 修改操作较少
最多只会有 2*n = 2000 个端点
则可以 对修改的 端点进行离散化

题目要求 封闭图形的 面积
经过离散化后数据范围较小
则可以 进行线段树扫描线


代码实现:

T1:

  • 考场代码:
#include
#include
#include
#include
const int MARX = 1e5+10;
//=============================================================
struct cat
{
    int t,ai;
    bool operator < (const cat sec) const
    {
        if(t == sec.t) return ai > sec.ai;
        return t > sec.t;
    }
};
int n,m,now,x,  sum,a[MARX];
std::priority_queue  q;
//=============================================================
inline int read()
{
    int s=1, w=0; char ch=getchar();
    for(; !isdigit(ch);ch=getchar()) if(ch=='-') s =-1;
    for(; isdigit(ch);ch=getchar()) w = w*10+ch-'0';
    return s*w;
}
//=============================================================
signed main()
{
    freopen("fish.in", "r", stdin);
    freopen("fish.out", "w", stdout);
    now = m = read(), n = read(), x = read();
    for(int i=1; i<=n; i++) a[i] = read();
    
    std::sort(a+1, a+n+1);
    for(int i=1; i<=n; i++)
      if(now)
      {
        now --;
        q.push((cat){a[i],a[i]});
      }
    
    for(; !q.empty(); )
    {
      cat top = q.top();
      q.pop();
      if(top.t > x) break;
      sum ++;
      if(now)
      {
        now -- ;
        q.push((cat){top.t+top.ai,top.ai});
      }
    }
    printf("%d %d",now,m-sum-now);
}
  • 正解:
#include
#include
#include
#include
const int MARX = 1e5+10;
//=============================================================
struct cat
{
    int t,ai;
    bool operator < (const cat sec) const
    {
        if(t == sec.t) return ai > sec.ai;
        return t > sec.t;
    }
};
int n,m,now,x,  sum,a[MARX];
std::priority_queue  q;
//=============================================================
inline int read()
{
    int s=1, w=0; char ch=getchar();
    for(; !isdigit(ch);ch=getchar()) if(ch=='-') s =-1;
    for(; isdigit(ch);ch=getchar()) w = w*10+ch-'0';
    return s*w;
}
//=============================================================
signed main()
{
    freopen("fish.in", "r", stdin);
    freopen("fish.out", "w", stdout);
    now = m = read(), n = read(), x = read();
    for(int i=1; i<=n; i++) a[i] = read();
    
    std::sort(a+1, a+n+1);
    for(int i=1; i<=n; i++)
      if(now)
      {
        now --;
        q.push((cat){a[i],a[i]});
      }
    
    for(; !q.empty(); )
    {
      cat top = q.top();
      q.pop();
      if(top.t > x) break;
      sum ++;
      if(now && top.t

T2:

  • 考场代码:
//
/*
By:Luckyblock
*/
#include
#include
#define int long long
#define max(a,b) (a>b?a:b)
const int MARX = 5e3+10;
//=============================================================
int n,m , p[MARX],q[MARX],v[MARX];
int f[MARX];
//=============================================================
inline int read()
{
    int s=1, w=0; char ch=getchar();
    for(; !isdigit(ch);ch=getchar()) if(ch=='-') s =-1;
    for(; isdigit(ch);ch=getchar()) w = w*10+ch-'0';
    return s*w;
}
//=============================================================
signed main()
{
    freopen("bag.in","r",stdin);
    freopen("bag.out","w",stdout);
    n=read(),m=read();
    for(int i=1; i<=n; i++) 
      p[i]=read(),q[i]=read(),v[i]=read();
    
    for(int i=1; i<=n; i++)
      for(int j=m; j>=q[i]; j--)
        if(j>=p[i])
          f[j] = max(f[j],f[j-p[i]]+v[i]);
    printf("%lld",f[m]);
}//
  • 正解:
#include
#include
#include
#include
using namespace std;
const int N=5115;
int read() {
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int f[N][N],n,m;
struct node {
    int p,q,v,rqy;
} a[N];
int ans;
int cmp(node x,node y) {return x.rqy>y.rqy;}
int main() 
{
    freopen("bag.in","r",stdin);
    freopen("bag.out","w",stdout);
    cin>>n>>m;
    for(int i=1; i<=n; ++i) a[i].p=read(),a[i].q=read(),a[i].v=read(),a[i].rqy=a[i].q-a[i].p;
    sort(a+1,a+1+n,cmp);
    memset(f,-64,sizeof(f));
    f[0][0]=0;
    for(int i=1; i<=n; ++i) 
    { 
        for(int j=0; j<=m; ++j) 
        { 
            f[i][j]=f[i-1][j];
            if(j-a[i].p<=m-a[i].q&&j>=a[i].p) f[i][j]=max(f[i][j],f[i-1][j-a[i].p]+a[i].v);
            ans=max(f[i][j],ans);
        }
    }
    cout<

T3:

  • 考场代码:
/*
By:Luckyblock
*/
#include
#include
#include
#include
#include
#define int long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a dir;
//=============================================================
inline int read()
{
    int s=1, w=0; char ch=getchar();
    for(; !isdigit(ch);ch=getchar()) if(ch=='-') s =-1;
    for(; isdigit(ch);ch=getchar()) w = w*10+ch-'0';
    return s*w;
}
void bfs()
{
    std::queue  x,y;
    x.push(minx), y.push(miny);
    x.push(minx), y.push(maxy);
    x.push(maxx), y.push(miny);
    x.push(maxx), y.push(maxy);
    
    while(!x.empty())
    {
      int tx = x.front(),ty = y.front();
      x.pop() , y.pop();
      
      for(int i=0; i<4; i++)
      {
        int nx = tx+ex[i], ny = ty+ey[i];
        if(nx < minx || nx>maxx || ny < miny || ny > maxy) continue;
        if(map[nx][ny]) continue;
        
        map[nx][ny] = -1;
        x.push(nx), y.push(ny);
        ans--;
      }
    }
}
//=============================================================
signed main()
{
    freopen("beng.in","r",stdin);
    freopen("beng.out","w",stdout);
    dir['L']=0,dir['R']=1,dir['U']=2,dir['D']=3;
    std::cin>>k;
    while(k--)
    {
      std::cin>>a;
      std::cin>>c;
      int newx = nowx + ex[dir[a]]*c, 
      newy = nowy + ey[dir[a]]*c;
      
      for(int i=min(nowx,newx); i<=max(nowx,newx); i++)
        for(int j=min(nowy,newy); j<=max(nowy,newy); j++)
          map[i][j] ++;
          
      nowx = newx , nowy=newy;
      minx = min(minx,nowx) , miny = min(miny,nowy);
      maxy = max(maxy,nowy) , maxx = max(maxx,nowx);
    }
    minx--,miny--,maxx++,maxy++;
    ans = (maxx-minx+1)*(maxy-miny+1);
    bfs();
/*  
    for(int i=minx; i<=maxx; putchar('\n'),i++)
        for(int j=miny; j<=maxy; j++)
          printf("%3d",map[i][j]);
*/
    printf("%d",ans);
}
  • 正解:

你可能感兴趣的:(2019.10.8 题解报告)