Educational Codeforces Round 18
A. New Bus Route
题目大意:给出n个不同的数,问差值最小的数有几对。(n<=200,000)
思路:排序一下,差值最小的一定是相邻的,直接统计即可。
#include<cstdio>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X,F;
inline int read()
{
for(F=;(C=*S++)<''||C>'';)if(C=='-')F=-;
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X*F;
}
#define MN 200000
int a[MN+];
int main()
{
fread(B,,<<,stdin);
int n=read(),i,mn=0x7FFFFFFF,cnt=;
for(i=;i<=n;++i)a[i]=read();
sort(a+,a+n+);
for(i=;i<n;++i)
{
a[i]=a[i+]-a[i];
if(a[i]<mn)mn=a[i],cnt=;
if(a[i]==mn)++cnt;
}
printf("%d %d",mn,cnt);
}
B. Counting-out Rhyme
题目大意:n个人站成一圈,一开始第1个人是首领,k次操作,每次首领向后数ai个人让那个人滚蛋并使这个人的后一个人变成首领,求每次谁滚蛋了。(1<=k<n<=100,ai<=10^9)
思路:ai对当前剩余人数取模后模拟。
#include<cstdio>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100
int u[MN+];
int main()
{
fread(B,,<<,stdin);
int n,k,i,x,s=;
n=read();k=read();
for(i=;i<k;++i)
{
for(x=read()%(n-i)+;x--;)while(u[++s>n?s=:s]);
u[s]=;printf("%d ",s);
}
}
C. Divide by Three
题目大意:给定一个长度为n的数字串,求一个最长的子序列满足没有前导0且是3的倍数。(n<=100,000)
思路:上过小学的都知道3的倍数各位数字和也是3的倍数。从后往前枚举哪个数字作为最后子序列的第一位数字,求出这个后缀各位之和模3的值,还有这一位后面有几个模3等1和模3等2的数,分情况判断即可。
#include<cstdio>
#include<cstring>
#define MN 100000
char s[MN+];
int main()
{
int n,i,f=,f1=,f2=,ans=-,p,pf1,pf2;
scanf("%s",s+);n=strlen(s+);
for(i=n;i;--i)
{
f=(f+(s[i]-=''))%;
if(s[i])
{
if(!f&&(ans<||i<=ans))ans=i-,p=i,pf1=pf2=;
if(f==&&f1&&(ans<||i<ans))ans=p=i,pf1=,pf2=;
if(f==&&f2>&&(ans<||i+<ans))ans=i+,p=i,pf1=,pf2=;
if(f==&&f2&&(ans<||i<ans))ans=p=i,pf1=,pf2=;
if(f==&&f1>&&(ans<||i+<ans))ans=i+,p=i,pf1=,pf2=;
}
else if(ans<)ans=-;
if(s[i]%==)++f1;
if(s[i]%==)++f2;
}
if(ans<-)return *puts("");
if(ans<)return *puts("-1");
for(printf("%d",s[i=p]);++i<=n;)
if(s[i]%==&&pf1)--pf1;
else if(s[i]%==&&pf2)--pf2;
else printf("%d",s[i]);
}
D. Paths in a Complete Binary Tree
题目大意:有一棵n个节点的满二叉树,节点标号为中序遍历,每次询问一个点,经过一串操作后在哪个点,操作有U,L,R,分别为走向父亲和左右儿子。(n<=10^18,操作总长<=10^5)
思路:我觉得转成先序遍历后再转回来比较直观,具体实现看下面的代码。
#include<cstdio>
#include<iostream>
using namespace std;
#define ll long long
#define MN 100000
char s[MN+];
ll find(ll x,ll n,ll k)
{
n>>=;
if(k<=n)return find(x<<,n,k);
if(k-=n+)return find(x<<|,n,k);
return x;
}
ll query(ll x,ll n)
{
int cnt=,a[];ll ans=;
while(x>)a[cnt++]=x&,x>>=;
while(cnt--){n>>=;if(a[cnt])ans+=n+;}
return ans++(n>>);
}
int main()
{
ll n,x;int q,i;
cin>>n>>q;
while(q--)
{
cin>>x;scanf("%s",s);
x=find(,n,x);
for(i=;s[i];++i)
{
if(s[i]=='U'&&x>)x>>=;
if(s[i]=='L'&&x<<<n)x<<=;
if(s[i]=='R'&&x<<<n)x=x<<|;
}
cout<<query(x,n)<<endl;
}
}
E. Colored Balls
题目大意:给出n个数ai,问把这些数字拆成若干个相差不超过1的数字最少拆几个。(n<=500,ai<=10^9)
思路:设最后全部拆成x和x-1,对于每个ai,符合条件的x满足x能整除ai或ai/x不小于x-1-ai%x,而对于每个ai,合法的x只有O(ai^0.5)种,枚举x<=ai^0.5,暴力check x,ai/x,ai/x-1,ai/x+1即可。复杂度O(n*ai^0.5)。
#include<cstdio>
#include<algorithm>
using namespace std;
#define MN 500
int n,a[MN+];
long long ans=1LL<<;
void cal(int x)
{
if(!x)return;
long long sum=;
for(int i=;i<=n;++i)
{
if(a[i]%x==||(a[i]/x>=x--a[i]%x))sum+=a[i]/x+bool(a[i]%x);
else return;
}
ans=min(ans,sum);
}
int main()
{
int i;
scanf("%d",&n);
for(i=;i<=n;++i)scanf("%d",&a[i]);
for(i=;i*i<=a[];++i)cal(i),cal(a[]/i),cal(a[]/i-),cal(a[]/i+);
printf("%I64d",ans);
}
Educational Codeforces Round 18的更多相关文章
- Educational Codeforces Round 18 D
Description T is a complete binary tree consisting of n vertices. It means that exactly one vertex i ...
- Educational Codeforces Round 18 B
Description n children are standing in a circle and playing the counting-out game. Children are numb ...
- Educational Codeforces Round 18 A
Description There are n cities situated along the main road of Berland. Cities are represented by th ...
- Educational Codeforces Round 18 C. Divide by Three DP
C. Divide by Three A positive integer number n is written on a blackboard. It consists of not more ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 40 F. Runner's Problem
Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...
- [Educational Codeforces Round 16]E. Generate a String
[Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...
- [Educational Codeforces Round 16]D. Two Arithmetic Progressions
[Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...
- [Educational Codeforces Round 16]C. Magic Odd Square
[Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...
随机推荐
- codves 3044 矩形面积求并
codves 3044 矩形面积求并 题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Desc ...
- node创建第一个应用
如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...
- Java面试题合集(二)
接下来几篇文章准备系统整理一下有关Java的面试题,分为基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注: ...
- axure 预览"HTTP/1.1 302 Found"
使用Axure编辑原型时,点击预览出现"HTTP/1.1 302 Found" 第一想到的就是重新安装Axure和检查原型文件是否损坏,验证后证明前Axure和.rp文件都是完好的 ...
- GIT入门笔记(19)GIT 小结
1.add和commit为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:$ git add file1.txt$ g ...
- ssh整合之四单独搭建struts的运行环境
1.导入struts的基本jar包 2.在web.xml中配置我们struts的核心控制器StrutsPrepareAndExecuteFilter <?xml version="1. ...
- Oracle处理XML字段时遇到的ORA-31013: XPATH 表达式无效问题
select extractValue(ed.info_id, '/Root/ExpandProfile/PhoneNumber') as phone, extractValue(ed.info_id ...
- python编程基础--计算机原理之硬件基础
一.寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果. 1.寄存器的特性: 1)寄存器位于CPU内部,数量很少,仅十四个: 2)寄存器所能存储的数据不一定 ...
- Linux:nohub启动后台永久进程
nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号.在注销后使用 nohup 命令运行后台中的程序.要运行后台中的 nohup 命令,添加 ...
- Java面试题—初级(2)
11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...