Codeforces Round #517 Div. 1翻车记
A:真的懵逼了。冷静了半天之后决定二分一下答案,然后先a安排上尽量小的再贪心地一个个扩大。40min才过。这个做法非常怂的以代码复杂度和时间复杂度为代价换取了比较稳的正确性,事实上由于1~n可以组合出1~n*(n+1)/2的所有数,只要从大到小贪心地放就可以了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a,b,ans,ansa[],ansb[],cnta,cntb;
bool flag[];
bool check(int k)
{
int w=a;cnta=cntb=;
for (int i=;i<=k;i++)
if (w>=i) ansa[++cnta]=i,w-=i;
else break;
ansa[cnta+]=k+;
for (int i=cnta;i>=;i--)
{
if (!w) break;
while (w&&ansa[i]+<ansa[i+]) ansa[i]++,w--;
}
if (b>=1ll*k*(k+)/-(a-w)) return ;
else return ;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
a=read(),b=read();
n=sqrt((a+b)*2ll)+;
int l=,r=n;
while (l<=r)
{
int mid=l+r>>;
if (check(mid)) ans=mid,l=mid+;
else r=mid-;
}
int w=a;cnta=cntb=;
for (int i=;i<=ans;i++)
if (w>=i) ansa[++cnta]=i,w-=i;
else break;
ansa[cnta+]=ans+;
for (int i=cnta;i>=;i--)
{
if (!w) break;
while (w&&ansa[i]+<ansa[i+]) ansa[i]++,w--;
}
printf("%d\n",cnta);
for (int i=;i<=cnta;i++) printf("%d ",ansa[i]),flag[ansa[i]]=;
cout<<endl;
printf("%d\n",ans-cnta);
for (int i=;i<=ans;i++)
if (!flag[i]) printf("%d ",i);
return ;
}
B:首先对于修改字母显然要找到一个离左上角尽量远的可以将这段路径都改为a的点。这样可能是斜的一排点。然后考虑怎么使字典序最小,类似bfs的每次考虑斜的一排点,如果他可以由一个可能在答案中的点走来并成为最优解就给他标记上,最后由终点倒序输出即可。花了50min。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 2010
int n,m,a[N][N],f[N][N],ans[N*],cnt=;
bool flag[N][N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
char c=getchar();
while (c<'a'||c>'z') c=getchar();
a[i][j]=c-'a'+;
}
for (int i=;i<=n;i++) f[][i]=f[i][]=n*n;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (i==&&j==) f[i][j]=a[i][j]!=;
else f[i][j]=min(f[i-][j],f[i][j-])+(a[i][j]!=);
int step=-;
for (int k=*n-;k>=;k--)
{
for (int i=;i<=n;i++)
{
int j=k-i+;
if (<=j&&j<=n&&f[i][j]<=m) {step=k;flag[i][j]=;}
}
if (step!=-) break;
}
for (int i=;i<=step+;i++) putchar('a');
flag[][]=;
for (int k=step+;k<=*n-;k++)
{
int c=;
for (int i=;i<=n;i++)
{
int j=k-i+;
if (<=j&&j<=n&&(flag[i-][j]||flag[i][j-])) c=min(c,a[i][j]);
}
for (int i=;i<=n;i++)
{
int j=k-i+;
if (<=j&&j<=n&&(flag[i-][j]||flag[i][j-])&&a[i][j]==c) flag[i][j]=;
}
}
/*for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
cout<<flag[i][j]<<' ';
cout<<endl;
}*/
int x=n,y=n;
while (x-+y->step)
{
ans[++cnt]=a[x][y];
if (flag[x-][y]) x--;
else y--;
}
for (int i=cnt;i>=;i--) putchar(ans[i]+'a'-);
return ;
}
然后就弃疗了。
result:rank 227 rating +6 稳定的没救了。
Codeforces Round #517 Div. 1翻车记的更多相关文章
- Codeforces Round#500 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round#509 Div.2翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Educational Codeforces Round 56 Div. 2 翻车记
A:签到. B:仅当只有一种字符时无法构成非回文串. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Educational Codeforces Round 55 Div. 2 翻车记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- Codeforces Round#514 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round #524 Div. 2 翻车记
A:签到.room里有一个用for写的,hack了一发1e8 1,结果用了大概600+ms跑过去了.惨绝人寰. #include<iostream> #include<cstdio& ...
- Codeforces Round#516 Div.1 翻车记
A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...
- Educational Codeforces Round 53 Div. 2翻车记
A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)
Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...
随机推荐
- spark history server
参考:http://blog.csdn.net/lsshlsw/article/details/44786575 为什么需要historyServer? 在运行Spark Application的时候 ...
- 开胃小菜——impress.js代码详解
README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看i ...
- 「日常训练」Queue(Codeforces Round 303 Div.2 D)
简单到让人不敢相信是D题,但是还是疏忽了一点. 题意与分析 (Codeforces 545D) 题意:n人排队,当一个人排队的时间超过他需要服务的时间就会厌烦,现在要求一个最优排列使得厌烦的人最少. ...
- VIN码识别/车架号OCR识别:快速占领汽车后市场数据入口
大数据时代,企业在数据入口方面的竞争越来越激烈,这种对于入口级的大数据“争夺战”,让很多企业在数据挖掘和收集的技术方面开始加快更新速度. 在当前IT行业激烈竞争环境之下,对于入口产品的控制成为了大数据 ...
- angular-使用iframe做独立页(iframe传值到angular和iframe里请求后台数据)
这个方法使用过两次.一次是在项目中嵌入一个表达式生成器.因为用别人做好的网页变成组件很难,而且里面用了jq,与angular思想相反不能用.另一次是因为想要单独引用样式.而innerHTML使用的样式 ...
- ubuntu networking 与 network-manager
刚遇到的坑,因为操作不当导致网络中断,于是手动配置了/etc/network/interfaces , 修复了系统之后发现ubuntu-desktop中的有线链接不见了,百度了一下说是networki ...
- Paper Reading - Convolutional Image Captioning ( CVPR 2018 )
Link of the Paper: https://arxiv.org/abs/1711.09151 Motivation: LSTM units are complex and inherentl ...
- Js全反选DataGrid
// **************************************************************** // // function Trim(value) // -- ...
- C#程序 权限不够的解决方案
有时候需要操作硬件,或者启动windows服务程序时,系统会提示很多奇怪的问题,归根结底就是程序当前所拥有的权限不够,需要提升,以前我们时手写一个manifest,多不容易啊, 现在有正常的方法了 1 ...
- Pipeline组Beta版本发布说明
项目名称 Pipeline 项目版本 Beta版本 负责人 北京航空航天大学计算机学院 IloveSE 小组 联系方式 http://www.cnblogs.com/IloveSE 要求发布日期 20 ...