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的矩阵,矩阵中的每个位置上都长着一棵树 ...
随机推荐
- Get,Post和Head具体解释
HTTP请求最经常使用的三个方法: (1)Get方法. 取回请求URL标志的不论什么信息,在浏览器的地址栏中输入网址的方式訪问网页时,浏览器採用GET方法向server获取资源. (2)Post方法. ...
- java 究竟老年代和年轻代的比例为多大合适呢?
眼下我还没有这方面过多的经验,和切身体会 只是以我眼下的水平看来,年轻代不宜大,假设年轻代大会导致转为老年代的时候,老年代撑不下.导致full gc.回收停顿时间过长
- vue.2.0-自定义全局组件
App.vue <template> <div id="app"> <h3>welcome vue-loading</h3> < ...
- 优化时序之补全if else
时序优化中重要的一项就是提高模块的最高工作频率,工作频率由关键路径决定,通常的提高工作频率的步骤是:利用时序分析工具找到关键路径,分析关键路径主要延迟是布线延迟还是逻辑延迟,然后轮番十八般武器,如果是 ...
- Lesson 1 Basic Concepts: Part 2
Getting your web site ‘live’ on the Web With the nerd background details under our belts, we can now ...
- orm 通用方法——QueryModelById 主键查询
方法定义: /** * 描述:根据主键查询 * 作者:Tianqi * 日期:2014-09-15 * param:model 对象实例,包含主键 * return:对象 * */ func Quer ...
- android 客户端 Cookie处理
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). Cookie最早是网景公司的前雇员Lou Montul ...
- Linux常用Office办公软件
1.WPS Office是由金山软件股份有限公司自主研发的一款办公软件套件,可以实现办公最常用的文字.表格.演示等多种功能.免费提供海量的在线存储空间及文档模板.支持阅读和输出PDF文件.全面兼容Mi ...
- 好吧,左小波出山了——ie8兼容indexOf问题
我,还是一个不懂世事的毛头小子,第一次写博.万事开头难,没事咱慢慢来.咳,练文笔吗.我觉得写东西最锻炼逻辑思维,我是一个不善于表达的人,可能是程序员的通病,但你看看人家王小波,八九十年代的作家兼职程序 ...
- 脚本实现自动化安装lamp&lnmp
#备注:前提是将lnmp和lnmp自动化脚本写好放在相应的路径, 脚本已写好,请查看我博客中的 shell脚本 专栏! #!/bin/bash #安装lamp或者lnmp path=/server/s ...