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'); elseif (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这样的中等题要争取切掉。

转载于:https://www.cnblogs.com/cjjsb/p/9639943.html

2018 Multi-University Training Contest 1 部分简单题解析相关推荐

  1. 2019 Multi-University Training Contest 7 部分补题

    2019 Multi-University Training Contest 7 部分补题 这场比赛三个人一起组队,比赛期间自己感觉并没有奉献多少东西,所以补题.而且总感觉比赛到后期很乏力(没力气那种 ...

  2. NKU两题简单题解析(递归分析与位运算技巧)

    题目:http://acm.nankai.edu.cn/p1002.html 题意:对给定的f(n),当 n>=50025002 的时候,f(n)=n-5:当 n<50025002 的时候 ...

  3. HDU 1576 A/B(数论简单题,求逆元)

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. Sichuan University Programming Contest 2018 Preliminary

    嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...

  5. 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...

  6. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  7. 2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18))

    2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18)) 题目 A B C D E ...

  8. 2018 Multi-University Training Contest 7 Age of Moyu

    Age of Moyu 来追梦 Problem Description Mr.Quin love fishes so much and Mr.Quin's city has a nautical sy ...

  9. 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard(...)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

最新文章

  1. python定义一个空数组_python – 在numpy数组中设置空值
  2. 计算机考研最后四十天,2021考研最后四十天冲刺复习攻略
  3. Hibernate 关联映射 之 多对多 关联(二) 之拆分
  4. 如何估算Oracle数据库所需的UNDO表空间的大小
  5. 虚拟机照样飞速跑Windows Server2008
  6. linux目录操作函数
  7. 形状相似的物品_空运一般货物及危险品和特殊物品对包装的要求和规定!
  8. RuoYi-Vue 部署 Linux环境 若依前后端分离项目(war 包+nginx版本)
  9. JavaScript--小白入门篇1
  10. 【干货】2021微信生态下的营销洞察.pdf(附下载链接)
  11. APUE读书笔记-04文件和目录(5)
  12. Linux 命令(113)—— seq 命令
  13. openssl linux更新视频,Linux下为OpenSSL安装更新
  14. Android通过post请求发送一个xml,解析返回xml数据
  15. Java 操作 HBase 教程
  16. 给定一个字符串,若是回文字符串则返回该字符串,否则补充该字符串成为回文字符串
  17. [原创]和Taskmgr过不去篇(无厘头版)
  18. v5服务器装系统,HIPAA海鲅V5s笔记本一键u盘装系统win10教程
  19. Windows11微软官方网址下载地址(2021年11月更新)
  20. 远程办公何时了,网络打洞帮你搞

热门文章

  1. StatisticsView
  2. 机器学习“调音师”:如何及何时重新调校ML
  3. Windows下的systeminfo命令获取系统信息
  4. 数字逻辑学习总结-MOOC数字逻辑设计
  5. 基于单片机的模拟风扇控制系统
  6. python编程8g的内存够么_内存8G够用吗?深入解读~
  7. EMMC 擦除组的理解
  8. [转]一个IT人才的精彩故事
  9. Linux kernel的中断子系统之(二):IRQ Domain介绍
  10. VMware12安装图解