Day4上午解题报告
预计分数:50 +0+0=50
实际分数:50+0+10=60
毒瘤出题人,T3不给暴力分 (*  ̄︿ ̄)
T1
https://www.luogu.org/problem/show?pid=T15564
一眼贪心,
但是不知道怎么维护。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1e6;
const int INF=0x7ffff;
inline int read()
{
char c=getchar();int flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
int zero;
int n;
int a[MAXN];
int tmp[MAXN];
int main()
{
// freopen("multiset.in","r",stdin);
// freopen("multiset.out","w",stdout);
n=read();
for(int i=;i<=n;i++) a[i]=read();
sort(a+,a+n+);
int now=;
int num=n;
int bg=INF;
int ans=;
while(num!=)
{
zero=;bg=INF;
for(int i=;i<=num;i++)
{
if(a[i]==) zero++;
if(a[i]>=)
{
a[i]--;
if(bg==INF)bg=i;
} }
int nownum=;
for(int i=;i<=zero/;i++)
tmp[++nownum]=;
if(zero%==)
tmp[++nownum]=;
for(int i=bg;i<=num;i++)
tmp[++nownum]=a[i];
for(int i=;i<=nownum;i++) a[i]=tmp[i];
num=nownum;
ans++;
}
printf("%d",ans);
return ;
} /*
5
0 0 0 3 3 //5
2
2 1//3
4
1 0 2 3//4 */
50分暴力
正解
考虑如何从最终状态转移
贪心思路:
让不是0的变小。
让0的个数变少。
暴力——》50
考虑如何优化
用一个桶记录,
a[0]->(a[0]+1)/2->a[1]
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <vector>
#include <utility>
using namespace std;
const int MAXN = 5e6 + , MX = 1e6;
int N, a[MAXN], cnt[MAXN], res, lim; int main()
{
freopen("multiset.in", "r", stdin);
freopen("multiset.out", "w", stdout);
scanf("%d", &N);
for (int i = ; i <= N; ++i) {
scanf("%d", &a[i]);
lim = max(lim, a[i]);
++cnt[a[i]];
}
int l = , z = cnt[];
for (int i = ; i <= lim; ++i) {
++res;
z = (z + ) / ;
z += cnt[i];
}
for (; z > ; z = (z + ) / ) ++res;
printf("%d\n", res);
return ;
}
T2
一开始没看懂样例
这句话我捉摸了好久,我以为他的意思是在每组里面都要重新标号。。
直到最后20分钟问了一下zzx才恍然发现居然有50分的暴力分!!!!(lyq实测有80){{{(>_<)}}}
正解:
做法①:暴力加边,每次BFS,可以加一个剪枝,每次只有做到过要加的点才BFS,复杂度:$O(m)$
做法②:单向并查集
做法③:对于每个点
倍增分割的长度,保证$2^p-1~2^p$,再在这段区间内二分,时间复杂度$O(m*log)$
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=;
typedef long long ll; int n, m;
int vis[N], u[N], v[N];
vector<int> vec[N]; bool dfs(int u)
{
if (vis[u]) return false;
if (u == n) return true;
vis[u] = ;
bool ret = false;
for (int i = ; i < vec[u].size(); i++)
{
ret = dfs(vec[u][i]);
if (ret) return true;
}
return false;
} int read()
{
char ch = getchar();
int x = ;
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) {x = x*+(ch-'');ch=getchar();}
return x;
} bool check(int sta, int las)
{
for (int i = sta; i <= las; i++)
vec[u[i]].push_back(v[i]); bool ret = dfs(); for (int i = sta; i <= las; i++)
{
vis[u[i]] = vis[v[i]] = ;
vec[u[i]].clear();
}
vis[] = ;
return ret;
} int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n = read(), m = read();
for (int i = ; i < m; i++)
{
//scanf("%d%d", &u[i], &v[i]);
u[i] = read(); v[i] = read();
}
int now = , ans = ;
while (now < m)
{
int i;
for (i = ; i + now <= m; i <<= )
if (check(now, now + i - )) break;
i >>= ;
int nowtmp = now + i;
for (; i > ; i >>= )
if (nowtmp + i <= m && !check(now, nowtmp + i - ))
nowtmp += i;
ans++;
now = nowtmp; }
cout << ans << endl;
}
正解
T3
一开始yy了一个自以为正确的贪心
然后花了一个多小时打了暴力
发现暴力只能过n<=10,贪心两组错一组。
GG。。。
后来莫名其妙多过了一个点。。。。
正解
贪心
期望的序列:1 2 3 4 5
5 5 5 5 5
4 3 2 1 0
1 2 3 4 5
$f[i][j]$血量为$i$的兵,空了$j$刀
变形的背包。。
用一个栈维护
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std; const int MAXN = + ;
int a[MAXN];
int cnt[MAXN], sta[MAXN], c[MAXN];
int f[MAXN][MAXN]; int main()
{
freopen("cs.in", "r", stdin);
freopen("cs.out", "w", stdout);
int T;
scanf("%d", &T);
for (int num = ; num <= T; ++num)
{
int N, maxn = ;
scanf("%d", &N);
memset(cnt, , sizeof(cnt));
memset(c, , sizeof(c));
memset(f, , sizeof(f));
for (int i = ; i <= N; ++i)
{
scanf("%d", &a[i]); ++cnt[a[i]];
maxn = max(maxn, a[i]);
}
int top = ;
for (int i = ; i <= maxn; ++i)
if (cnt[i] == ) sta[++top] = i; else
{
while (cnt[i] > && top > ) {c[sta[top--]] = i; --cnt[i];}
c[i] = i;
} int ans = ;
for (int i = ; i <= maxn; ++i)
for (int j = ; j <= i; ++j)
{
if (j > ) f[i][j] = f[i - ][j - ];
if (c[i] != && j + c[i] - i < i)
f[i][j] = max(f[i][j], f[i - ][j + c[i] - i] + );
ans = max(ans, f[i][j]);
}
printf("%d\n", ans);
}
return ;
}
总结
这场考试策略失误太大了。。
T2明明有80的暴力分
还要死刚T3。。。。
Day4上午解题报告的更多相关文章
- Day1上午解题报告
预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...
- Day4下午解题报告
预计分数:30+30+0=60 实际分数:30+30+10=70 稳有个毛线用,,又拿不出成绩来,, T1 https://www.luogu.org/problem/show?pid=T15626 ...
- Day2上午解题报告
预计分数:100+0+60=160 实际分数:100+0+60=160 mmpT1数据错了... T1遭遇 题目描述 你是能看到第一题的 friends呢. —— hja ?座楼房,立于城中 . 第? ...
- Day3上午解题报告
预计分数:100+40+50=190 实际分数:100+40+50=190 T1 https://www.luogu.org/problem/show?pid=T15365 表示从来没做过博弈论的题, ...
- Day5上午解题报告
预计分数:100+40+30=170 实际假分数:0+0+0=0 CE*3 实际真分数:60+50+0=110 老师没把我的程序放的文件夹里面,于是..... T1 https://www.luogu ...
- 夏令营提高班上午上机测试 Day 4 解题报告
我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
随机推荐
- Linux Virtual Server技术
1 LVS简单介绍 Linux VirtualServer是一个高扩展和高可用性server,在一个真正server的集群中构建而成,包括Linux操作系统中的负载均衡. server的架构对于终端用 ...
- Codeforces 344C Rational Resistance
Description Mad scientist Mike is building a time machine in his spare time. To finish the work, he ...
- Vue数据驱动表单渲染,轻松搞定form表单
form-create 具有动态渲染.数据收集.校验和提交功能的表单生成器,支持双向数据绑定.事件扩展以及自定义组件,可快速生成包含有省市区三级联动.时间选择.日期选择等17种功能组件. Github ...
- Conservative GC (Part one)
目录 保守式GC 不明确的根 指针和非指针的区别 貌似指针的非指针 不明确数据结构 优点 准确式GC 正确的根 打标签 不把寄存器和栈等当做根 优点 缺点 间接引用 经由句柄引用对象 优缺点 保守式G ...
- Swift学习笔记(4)--字符串及基本使用
String是例如“hello, world”,“海贼王” 这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String类型与 Foundation ...
- 洛谷 P1964 【mc生存】卖东西
P1964 [mc生存]卖东西 题目背景 服务器好好玩 题目描述 lcy0x1去服务器的系统商店卖东西. 一个人的背包有21格. 一开始他的背包里有m件不同的物品(不能卖). 他要卖n种物品,每种物品 ...
- cogs 50. [NOIP2002] 选数
50. [NOIP2002] 选数 ★ 输入文件:choose.in 输出文件:choose.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述]: 已知 n 个整数 ...
- 将yyyyMMdd格式的字符串转成日期DateTime格式
1.DateTime dt= DateTime.ParseExact("20110720", "yyyyMMdd", Thread.CurrentThread. ...
- qwt的安装和移植-
目须要依据实时数据绘制出图表,因此我们找到了qwt库.这个库是一个绘制图表,曲线图,柱状图的统计图标. . .. 以下我们就具体解说一下这个库在Larm上的编译和移植 qwt介绍 QWT,全称是Qt ...
- OpenCASCADE解非线性方程组
OpenCASCADE解非线性方程组 eryar@163.com Abstract. 在科学技术领域里常常提出求解非线性方程组的问题,例如,用非线性函数拟合实验数据问题.非线性网络问题.几何上的曲线曲 ...