Preface

ACM系列赛第一站,没有进前200还是很伤的。

主要是T2当时没写出来就GG了,后来看了下其实不是很难。

题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的。


T1 Maximum Multiple

题目大意:给出一个数字\(n\),求三个数\(x,y,z\)满足\(x,y,z|n\)且\(x+y+z=n\)。找出这样一组并使得\(xyz\)最大。有解就输出\(xyz\)的最大值,否则输出\(-1\)。

大力猜结论,然后用ZWC当时写的一个暴力拍了下\(n\le200\)的情况发现没问题,然后就交了并1A了。

所以ACM猜结论成为我们队的日常

以下为看起来很有道理的结论:

  • 当\(3|n\)时,此时很显然,答案为\((\frac{3}{n})^3\)
  • 当\(4|n\)时,经过一番简单的推导,得到答案为\((\frac{4}{n})^2\cdot \frac{n}{2}\)
  • 其他情况一律无解

CODE

#include<cstdio>
#include<cctype>
using namespace std;
int n,t;
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; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(long long x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
int main()
{
//freopen("1.in","r",stdin); freopen("1.out","w",stdout);
register int i,j; read(t);
while (t--)
{
read(n);
if (n%3==0) write(1LL*(n/3)*(n/3)*(n/3)),putchar('\n'); else
if (n%4==0) write(1LL*(n/4)*(n/4)*(n/2)),putchar('\n'); else puts("-1");
}
return 0;
}

T3 Triangle Partition

这题我写的,感觉比T1简单。

题目大意:在平面内有保证三点不共线的\(3n\)个点,让你给出一种构造方案组成\(n\)个三角形,使得每个三角形互不相交

这个数学老师上课好像讲过,我们把三角形按\(x\)坐标排个序,然后每次三个三个取即可。这样显然不会相交。

CODE

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=1005;
struct data
{
int x,y,id;
}a[N*3];
int t,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; int flag=1; while (!isdigit(ch=tc())) flag=ch^'-'?1:-1;
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); x*=flag;
}
inline void write(int x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline bool cmp(data a,data b)
{
return a.x<b.x;
}
int main()
{
//freopen("3.in","r",stdin); freopen("3.out","w",stdout);
register int i; read(t);
while (t--)
{
for (read(n),i=1;i<=3*n;++i)
read(a[i].x),read(a[i].y),a[i].id=i;
sort(a+1,a+3*n+1,cmp);
for (i=1;i<=3*n;i+=3)
write(a[i].id),putchar(' '),write(a[i+1].id),putchar(' '),write(a[i+2].id),putchar('\n');
}
return 0;
}

T11 Time Zone

还是我写的,所以WA了几发。不过以后这种大力模拟题都是陈潇然大佬写的了。

题目大意:给出当前的时间(UTC +8)以及目标时区。让你求目标时区的时间。

大力模拟,有一些细节要注意:

  1. 读入的时区可能是负数或小数
  2. 处理跨度一天的时间是格外要注意一些诡异的情况

CODE

#include<cstdio>
using namespace std;
int t,a,b,x,y; char ch;
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&a,&b); ch=getchar(); while (ch!='+'&&ch!='-') ch=getchar();
scanf("%d",&x); y=0; if (getchar()=='.') scanf("%d",&y);
if (ch=='+')
{
x-=8; b+=y*6; if (b>59) b-=60,++a; if (b<0) b+=60,--a; a+=x; if (a>23) a-=24; if (a<0) a+=24;
} else
{
x+=8; b-=y*6; if (b<0) b+=60,--a; if (b>59) b-=60,++a; a-=x; if (a<0) a+=24; if (a>23) a-=24;
}
if (a>9) printf("%d:",a); else printf("0%d:",a);
if (b>9) printf("%d\n",b); else printf("0%d\n",b);
}
return 0;
}

T4 Distinct Values

这题是ZWC写的,我已经在YY线段树上二分的时候他说他用set艹过了此题。

一脸震惊,不过如果你看到下一场我用分块爆艹线段树就知道ACM的数据是极水的

题目大意:给你一个长度为\(n\)的序列以及\(m\)个限制条件,让你求一个字典序最小的序列满足对于每一个限制\(,i,j\in [l_i,r_i],i\not =j\)的一对\(i,j\)都有\(a_i\not = a_j\)

首先把操作按左端点排个序,然后考虑既然是字典序最小,那么贪心的想每一次肯定是把小数字的先放了。

考虑直接用set来维护一下当前可以被选择的数,那么我们在一个区间退出时可以直接把它从set里删掉,同时在右边更新的时候把当前这个数插进去即可,取得时候也是贪心地取set里的最小值。

CODE(ZWC写的,我懒得再写一遍了)

#include<cstdio>
#include<algorithm>
#include<set>
#define maxn 100005
using namespace std;
set<int> s;
int T,n,m,ans[maxn];
struct chi{
int l,r;
bool operator <(const chi b)const{return l<b.l||(l==b.l&&r>b.r);}
}a[maxn];
int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-f;ch=getchar();}
while(ch>='0'&&ch<='9') {ret=ret*10+ch-'0';ch=getchar();}
return ret*f;
}
int main(){
T=read();
while(T--){
s.clear();
n=read();m=read();
for(int i=1;i<=n;i++) s.insert(i),ans[i]=1;
for(int i=1;i<=m;i++) a[i].l=read(),a[i].r=read();
sort(a+1,a+1+m);
int lst=0;a[0].l=1;
for(int i=1;i<=m;i++){
if(a[i].r<=a[lst].r) continue;
for(int j=a[lst].l;j<a[i].l;j++) s.insert(ans[j]);
for(int j=max(a[lst].r+1,a[i].l);j<=a[i].r;j++) ans[j]=*s.begin(),s.erase(s.begin());
lst=i;
}
for(int i=1;i<=n;i++) printf("%d%c",ans[i],n==i?'\n':' ');
}
return 0;
}

T2 Balanced Sequence

这题之后做的,打的时候抽了没想出排序的cmp就GG了

题目大意:给出你\(n\)个括号序列,让你用合理的方法把这\(n\)个序列排好顺序后使得它们连在一起组成的序列中匹配的左右括号对数最多。

首先考虑先把每一个序列中已经含有的对数先算出来,这个很简单吧,拿栈或者直接开一个变量模拟一下就完了,这些对数可以直接累加到答案中。

考虑将已经计算完的括号对删去,那么剩下的一定是\(')'\cdot x+'('\cdot y\)这样的形式。

首先我们考虑全局的贪心,对于那些\(x_i>y_i\)的括号肯定得先放在后面,同样的\(x_i<=y_i\)的就应该尽量的往前放。

现在我们考虑局部的贪心如果两个序列\(i,j\)都是\(x_i>y_i\)的形式,那么为了避免浪费,我们肯定是把\(x_i\)小的放在前面。

同理,若两个序列\(i,j\)都是\(x_i<=y_i\)的形式,就要把\(y_i\)小的放在前面。

这样我们只要写好cmp然后在模拟一遍就好了。

CODE

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
struct data
{
int l,r;
}a[N]; char s[N]; int n,ans,len,res,t;
inline bool cmp(data a,data b)
{
if (a.l>a.r&&b.l<=b.r) return 1;
if (a.l<=a.r&&b.l>b.r) return 0;
if (a.l>a.r&&b.l>b.r) return a.r<b.r;
return a.l>b.l;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
for (scanf("%d",&t);t;--t)
{
register int i,j; ans=res=0;
for (scanf("%d",&n),i=1;i<=n;++i)
{
scanf("%s",s+1); len=strlen(s+1); a[i].l=a[i].r=0;
for (j=1;j<=len;++j) if (s[j]=='(') ++a[i].l;
else if (a[i].l) ++ans,--a[i].l; else ++a[i].r;
}
for (sort(a+1,a+n+1,cmp),i=1;i<=n;++i)
{
int p=min(res,a[i].r); ans+=p;
res-=p; res+=a[i].l;
}
printf("%d\n",ans<<1);
}
return 0;
}

Postscript

这次题目总体偏简单,然而我们还是不会做

看来以后这种像T2这样的中等题要争取切掉。

2018 Multi-University Training Contest 1 部分简单题解析的更多相关文章

  1. 2018 Multi-University Training Contest 2 部分简单题解析

    Preface 多校第二场,依靠罚时优势打到了校内的Rank 2 暴力分块碾标算系列 T4 Game 题目大意:在一个数集\([1,n]\)中两个人轮流选择其中的一个数,并从数集中删去这个数所有约数. ...

  2. 2018 Nowcoder Multi-University Training Contest 2

    目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...

  3. 2018 Nowcoder Multi-University Training Contest 1

    Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...

  4. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  5. 2018 Nowcoder Multi-University Training Contest 10

    Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...

  6. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  7. 2018 Multi-University Training Contest 2

    题目链接:2018 Multi-University Training Contest 2 6318 Swaps and Inversions 题意:sum=x*逆序个数+交换次数*y,使sum最小 ...

  8. 2018 Multi-University Training Contest 1

    比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...

  9. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

随机推荐

  1. SVN SVN合并(Merge)与拉取分支(Branch/tag)操作简介

    SVN合并(Merge)与拉取分支(Branch/tag)操作简介 合并(Merge) 例子:把对feature_branch\project_name_v3.3.7_branch的修改合并到deve ...

  2. Android RecycleView 自定义Item的使用

    自定义布局的RecycleView需要自己实现Adapter,ViewHolder和布局: 自定义Adapter继承RecycleView.Adapter,重写getItemCount(),onBin ...

  3. 微信小程序开发--路由切换,页面重定向

    这段时间开发了一个微信小程序,虽然小程序的导航API 官方文档写得很详细,但是在具体开发过程中还是会遇到很多不明白,或者一时转不过弯的地方. 1.页面切换传参,参数读取 1.1  wx.navigat ...

  4. linux kernel 源码安装

    有时我们在安装系统后,发现没有安装当前系统的内核源码在/usr/src/kernels目录下,其实我们是少安装了一个rpm包: 当你配置好yum源后: yum install kernel-devel ...

  5. Scrapy爬取遇到的一点点问题

    学了大概一个月Scrapy,自己写了些东东,遇到很多问题,这几天心情也不大好,小媳妇人也不舒服,休假了,自己研究了很久,有些眉目了 利用scrapy 框架爬取慕课网的一些信息 步骤一:新建项目 scr ...

  6. <20180929>任性的甲方

    今天参观了朋友在监督的新项目, 这个项目周期大概在6到9个月,预计本年度11月竣工. 总共大楼有五层, 施工面积在一万平米左右. 位于三楼的机房使用的设备有点高大上,发上来鉴赏一下. 双专线, 第二条 ...

  7. Lets encrypt安装及配置

    letsencrypt recommend that most people with shell access use the Certbot ACME client.It can automate ...

  8. P1802 5倍经验日(01背包问题,水题)

    题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉.干掉能拿不少经验的. 题目描述 现在absi2011拿出了x个迷你装药物 ...

  9. JS进阶之---this的指向

    this到底指向什么地方,决定于函数的调用方式. 1. 指向全局变量 --- 函数被单独调用的时候 function fn() { console.log( this.a ); } var a = 2 ...

  10. spring的@Transaction使用注意

    文章参考资料 https://www.cnblogs.com/andy-zhou/p/5317866.html http://labreeze.iteye.com/blog/2277261 Sprin ...