我实在是因为无聊至极来写Div3题解

感觉我主要的作用也就是翻译一下题目

第一次线上打CF的比赛,手速很重要。

这次由于所有题目都是1A,所以罚时还可以。

下面开始讲题

A.Remove Duplicates

题目大意:给你一个序列,让你对这个序列中重复的数进行去重。要求相对顺序不变并且有限保留右边的。

首先这道题O(n)扫一遍+hash是可以的,但是这数据范围。。。

开桶即可。

CODE

#include<cstdio>
const int N=55;
int a[N],n,ans[N],tot;
bool h[1005];
int main()
{
register int i;
for (scanf("%d",&n),i=1;i<=n;++i)
scanf("%d",&a[i]);
for (i=n;i>=1;--i)
if (!h[a[i]]) h[a[i]]=1,ans[++tot]=a[i];
for (printf("%d\n",tot),i=tot;i>=1;--i)
printf("%d ",ans[i]);
return 0;
}

B.File Name

题目大意:给你一个字符串,问你至少要删去几个字符才能使字符串中没有三个连续的'x'

直接扫一遍即可,每次看一下连续的x个数是多少。设统计出的个数为t,那么ans+=t-2(t>=3)

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=105;
char s[N],tot,ans;
int n;
int main()
{
register int i;
scanf("%d",&n); scanf("%s",s+1);
for (i=1;i<=n;++i)
if (s[i]=='x') ++tot; else
{
if (tot>=3) ans+=tot-2; tot=0;
}
if (tot>=3) ans+=tot-2;
printf("%d",ans);
return 0;
}

C. Letters

题目大意:给你n段数的中每一段数的长度。然后对于m个询问,给出这个数在第几段中的第几个。

题目很抽象?那我们根据第一个样例理解一下。

首先我们看1,就是第一段的第一个。又对于12,他是第二段的第二个(因为第一段长度为10)

然后我们可以先前缀和+二分弄出这一个数属于第几段,然后减一下即可。

但其实根本不需要二分,因为题目中说了所有的数严格递增但我没看见

不过二分也可以艹过去(虚什么)。

CODE

#include<cstdio>
using namespace std;
typedef long long LL;
const int N=2e5+5;
LL n,m,x,sum[N];
inline LL find(LL x)
{
LL l=0,r=n,res;
while (l<=r)
{
LL mid=(l+r)/2;
if (sum[mid]<=x) res=mid,l=mid+1; else r=mid-1;
}
return res;
}
int main()
{
register LL i;
scanf("%I64d%I64d",&n,&m);
for (i=1;i<=n;++i)
scanf("%I64d",&x),sum[i]=sum[i-1]+x;
for (i=1;i<=m;++i)
{
scanf("%I64d",&x); LL k=find(x);
if (sum[k]==x) printf("%I64d %I64d\n",k,sum[k]-sum[k-1]); else printf("%I64d %I64d\n",k+1,x-sum[k]);
}
return 0;
}

D. Almost Arithmetic Progression

题目大意:给你一串数,问你是否可以将每一个数通过不变||加1||减1三种操作的一种变成等差数列,若可以输出最少操作次数(不变不算次数),否则输出-1

等差数列的题目都有一个共同的尿性方法:确定了前两项,其他的值就确定了

所以我们枚举前两项的情况,然后对于所有有解的情况取最小值即可

CODE

#include<cstdio>
using namespace std;
const int N=100005;
int a[N],n,ans=N;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline int abs(int x)
{
return x>0?x:-x;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int check(int p,int q)
{
int x=a[1]+p,y=a[2]+q,d=y-x,last=y,tot=0;
for (register int i=3;i<=n;++i)
if (abs(a[i]-last-d)==1) ++tot,last+=d; else
{ if (abs(a[i]-last-d)!=0) return -1; else last+=d; }
return tot;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i;
for (read(n),i=1;i<=n;++i)
read(a[i]);
int k=check(0,0); if (k!=-1) ans=min(ans,k);
k=check(1,0); if (k!=-1) ans=min(ans,k+1);
k=check(-1,0); if (k!=-1) ans=min(ans,k+1);
k=check(0,1); if (k!=-1) ans=min(ans,k+1);
k=check(0,-1); if (k!=-1) ans=min(ans,k+1);
k=check(1,1); if (k!=-1) ans=min(ans,k+2);
k=check(-1,-1); if (k!=-1) ans=min(ans,k+2);
k=check(-1,1); if (k!=-1) ans=min(ans,k+2);
k=check(1,-1); if (k!=-1) ans=min(ans,k+2);
if (ans!=N) printf("%d",ans); else puts("-1");
return 0;
}

E. Bus Video System

题目大意:给你一个公交车的上下车情况,正数表示上车,当然负数就是下车。还给出了车的最大容量,车上的人数任何时候都不得超过最大容量。让你求车上最开始时车上的人数的可能情况

首先我们应该主要到这个人数是个区间,所以我们统计出车上可能人数的最少值l和最大值r,最后输出r-l+1即可。特别地,若r<l则输出0

对于合法性只需要满足两个关键条件:

1. 车上的人数任何时候都不得超过最大容量

2. 车上的人数任何时候都不得为负数

然后min,max转移l,r即可

具体看CODE

#include<cstdio>
using namespace std;
const int N=1005;
int n,m,x,sum[N],l,r;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc(); int flag=1;
while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=tc(); }
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
x*=flag;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n),read(m);
for (r=m,l=0,i=1;i<=n;++i)
{
read(x); sum[i]=sum[i-1]+x;
if (sum[i]>=0) r=min(r,m-sum[i]);
if (sum[i]<=0) l=max(l,-sum[i]);
}
if (l>r) puts("0"); else printf("%d",r-l+1);
return 0;
}

F. Mentors

这道题还是卡了一下的

题目大意:给你一个序列和一些关系。让你求对于每一个数,在序列中有多少数严格小于这个数并且和这个数没有关系。

首先我们sort一遍,求出对于每一个数有多少数比他小。

然后对于读入的关系,我们将较大的那个数的个数减1即可

CODE

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e5+5;
struct data
{
int x,num;
}a[N];
int n,m,r[N],s[N],x,y;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline bool comp(data a,data b)
{
if (a.x<b.x) return 1;
if (a.x>b.x) return 0;
if (a.num<b.num) return 1;
return 0;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i;
read(n); read(m);
for (i=1;i<=n;++i)
read(a[i].x),a[i].num=i;
sort(a+1,a+n+1,comp);
for (i=1;i<=n;++i)
r[a[i].num]=i;
for (i=1;i<=n;++i)
if (a[i].x==a[i-1].x) s[i]=s[i-1]; else s[i]=i;
while (m--)
{
read(x); read(y);
if (a[r[x]].x>a[r[y]].x) --s[r[x]];
if (a[r[y]].x>a[r[x]].x) --s[r[y]];
}
for (i=1;i<=n;++i)
printf("%d ",s[r[i]]-1);
return 0;
}

G. Petya's Exams

题目大意:一个人在n天内要参加m场考试。每一场考试都有一个可以开始复习的时间和考试时间,以及需要复习的时间。对于一场考试,如果没有复习满相应的天数就输出-1。

这个人每天可以从三项事情中选择一项去做:

  1. 休息,用0来表示

  2. 考试,进行每一场考试(考试当天无法复习),用m+1表示

  3. 复习,用i表示复习第i次考试的内容

让你求一种可以的安排方式,使得它通过所有的考试。输出每一天做的事情。

还是很简单的,一个小贪心,对于所有考试,肯定优先复习先开始的。除非有考试或者没有东西复习。

我们sort一遍然后枚举所有时间点即可

CODE

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=105;
struct data
{
int s,t,d,id;
}a[N];
int ans[N],t[N],num[N],n,m;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline bool comp(data a,data b)
{
return a.t<b.t;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j; read(n); read(m);
for (i=1;i<=m;++i)
read(a[i].s),read(a[i].t),read(a[i].d),a[i].id=i;
sort(a+1,a+m+1,comp);
for (i=1;i<=m;++i)
num[a[i].t]=i;
for (i=1;i<=n;++i)
{
if (num[i])
{
if (t[num[i]]==a[num[i]].d) { ans[i]=m+1; continue; } else { puts("-1"); return 0; }
}
for (j=1;j<=m;++j)
if (t[j]!=a[j].d&&i>=a[j].s) { ans[i]=a[j].id; ++t[j]; break; }
}
for (i=1;i<=n;++i)
printf("%d ",ans[i]);
return 0;
}

Codeforces Round #481 (Div. 3)的更多相关文章

  1. Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression

    http://codeforces.com/contest/978/problem/D 题目大意: 给你一个长度为n的b(i)数组,你有如下操作: 对数组中的某个元素+1,+0,-1.并且这个元素只能 ...

  2. Codeforces Round #481 (Div. 3) G. Petya's Exams

    http://codeforces.com/contest/978/problem/G 感冒是真的受不了...敲代码都没力气... 题目大意: 期末复习周,一共持续n天,有m场考试 每场考试有如下信息 ...

  3. Codeforces Round #481 (Div. 3) 全题解

    A题,题目链接:http://codeforces.com/contest/978/problem/A 解题心得:题意就是让你将这个数列去重,重复的数只保留最右边的那个,最后按顺序打印数列.set+m ...

  4. Codeforces Round #481 (Div. 3) C. Letters

    题目地址:http://codeforces.com/contest/978/problem/C 题解:有n个宿舍,每个宿舍人不一样多,有m封信,每封信送给对应的第m间房间,问这封信是给第几个宿舍,第 ...

  5. Codeforces Round #481 (Div. 3) B. File Name

    题目地址:http://codeforces.com/contest/978/problem/B 题解:一串文件名里不能出现连续的xxx,询问进行几次操作后,文件名才不会出现xxx. 方法:只要遍历一 ...

  6. Codeforces Round #481 (Div. 3) A. Remove Duplicates

    题目地址:http://codeforces.com/contest/978/problem/A 题解:给一串长度为n的数组,然后删去相同的数字(从右往左). 方法:题目n和数组ai给的范围都很小,所 ...

  7. Codeforces Round #481 (Div. 3)Petya's Exams CodeForces - 978G

    Petya studies at university. The current academic year finishes with nn special days. Petya needs to ...

  8. Codeforces Round #481 (Div. 3)题解

    成功掉到灰,真的心太累了,orz!!!!,不是很懂那些国外大佬为什么每次都是20多分钟AK的,QAQ A. Remove Duplicates time limit per test 1 second ...

  9. Codeforces Round #481 (Div. 3) G. Petya's Exams (贪心,模拟)

    题意:你有\(n\)天的时间,这段时间中你有\(m\)长考试,\(s\)表示宣布考试的日期,\(d\)表示考试的时间,\(c\)表示需要准备时间,如果你不能准备好所有考试,输出\(-1\),否则输出你 ...

随机推荐

  1. Telephone dialer

    运行电话拨号器,需要加这个权限,否则不会打通电话.这个权限是用户权限,是谷歌工程师为了跟自己撇清关系,用户需要权限的时候自己加. 运行android程序的时候提示:ActivityManager: W ...

  2. SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法(2)

    书接上文. 上文中描述了如何在 SpringCloud+Feign环境下上传文件与form-data同时存在的解决办法,实践证明基本可行,但却会引入其他问题. 主要导致的后果是: 1. 无法与普通Fe ...

  3. 数据库的IO and 数据库优化问题

    一.IO介绍 IO有四种类型:连续读,随机读,随机写和连续写,连续读写的IO size通常比较大(128KB-1MB),主要衡量吞吐量,而随机读写的IO size比较小(小于8KB),主要衡量IOPS ...

  4. python接口测试—get请求(一)

    python 做借口测试用到的是requests模块,首先要导入requests库,pip install requests 1.get直接请求方式 以豆瓣网为例: url = 'https://re ...

  5. python第五十七天------补上笔记

    direct_client:广播接收 #!/usr/bin/env python #_*_coding:utf-8_*_ import pika,time,sys connection = pika. ...

  6. entity framework异常 The specified cast from a materialized 'System.Int32' type to the 'System.String' type is not valid

    ROW_NUMBER() OVER (ORDER BY (select Null)) AS Id entity framework 查询中有这句会有异常

  7. 上下文管理器——with语句的实现

    前言 with语句的使用给我们带来了很多的便利,最常用的可能就是关闭一个文件,释放一把锁. 既然with语句这么好用,那我也想让我自己写的代码也能够使用with语句,该怎么实现? 下面具体介绍怎样实现 ...

  8. Github API

    Web API web api是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互,这种请求被称为API调用.请求的数据将以易于处理的格式(如JSON或CSV)返回:依赖于外部数据源的大多 ...

  9. Linux 小知识翻译 - 「Linux的吉祥物企鹅叫什么名字?」

    这次说说Linux的吉祥物 *企鹅* 都知道Linux的吉祥物是企鹅,但是这个企鹅叫什么名字呢? 它的名字就是「Tux」,注意可不是「Tax」(税收). 具体参考 wiki:中文解释  英文的解释更为 ...

  10. Java中选择排序,冒泡排序,插入排序,快速排序

    一:冒泡法排序  //冒泡排序 注:从小到大排   //特点:效率低,实现简单  //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...