目录
- 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 神题 , 30分钟打完部分分 , 5分钟打完暴力 ,
答题情况:
- 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
- 正解:
无