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++ ...
随机推荐
- [Jmeter]用Jmeter做压力测试(分布式)
Jmeter 是Java应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误.为了让jmeter工具提 ...
- DBoW2 词袋模型笔记
DBoW算法用于解决Place Recognition问题,ORB-SLAM,VINS-Mono等SLAM系统中的闭环检测模块均采用了该算法.来源于西班牙的Juan D. Tardos课题组. 主要是 ...
- MySQL高级-主从复制
一.复制的基本原理 1.slave会从master读取binlog来进行数据同步 2.步骤+原理图 二.复制的基本原则 1.每个slave只有一个master 2.每个slave只能有一个唯一的服务器 ...
- 【费元星原创】一键安装Hadoo2.7.6 集群完全分布式脚本-完美解决
有Bug 欢迎反馈,我不烦:feiyuanxing@gmail.com 1 #!/bin/bash #@author:feiyuanxing [既然笨到家,就要努力到家] #@date:2017-01 ...
- How To Install Apache Tomcat 7 on CentOS 7 via Yum
摘自:https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-7-on-centos-7-via-y ...
- 错误码:2003 不能连接到 MySQL 服务器在 (10061)
今天在ubuntu上安装了mysql服务器,在windows上用客户端软件连接mysql服务器时,出现错误: 错误码: 不能连接到 MySQL 服务器在 () 折腾来折腾去没搞好,防火墙也关了,330 ...
- Web应用服务器性能压力测试
压力测试需要关注三个方面:如何正确产生压力.如何定位瓶颈.如何预估系统的承载能力 产生压力的方法 通常可以写脚本产生压力机器人对服务器进行发包和收包操作,也可以使用现有的工具(像jmeter.Load ...
- 如何理解一台服务器可以绑定多个ip,一个ip可以绑定多个域名
一个域名只能对应一个IP的意思是域名在DNS服务器里做解析的时候 一条记录只能指向一个IP地址.这个是死规定,试想一下,如果一个子域名指向了2个ip ,当访问者打开这个域名的时候,浏览器是展示哪个IP ...
- GET请求的写法-jmeter
第一种写法:可以向post 请求一样写 第二种写法: /pinter/com/getSku?id=${__Random(1,100,rdmNum)}
- Mongo DB Java操作
1.首先下载Mongo DB java 驱动 2.操作Mongo 增删改查 package com.sjjy.mongo; import java.util.ArrayList;import java ...