A - Maximum Multiple

题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, n \equiv 0 \pmod z$ 并且使得 $x \cdot y \cdot z$ 最大

思路:设$a = \frac{n}{x}, b = \frac{n}{y}, c = \frac{n}{z}$ 那么 $\frac{1}{a} + \frac{1}{b} + \frac{1}{c} = 1$ 那么我们考虑去凑 a, b, c

两种方案  ${3, 3, 3}$  或者 ${2, 4, 4}$ 取max

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 ll n;

 int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%lld", &n);
if(n % == )
{
ll ans = n / ;
ans *= n / ;
ans *= n / ;
printf("%lld\n", ans);
}
else if(n % == )
{
ll ans = n / ;
ans *= n / ;
ans *= n / ;
printf("%lld\n", ans);
}
else
{
puts("-1");
}
}
return ;
}

B - Balanced Sequence

题意:求如何拼接 使得balanced Sequence 最长

思路:首先预处理,使得剩下的串都是 (((    或者 )))   或者 )))(((

((( 这种都放左边  ))) 都放右边  目前的问题就是 )))((( 这种在中间按什么顺序放使得答案最大

我们定义 $L_1, R_1$  $L_2, R_2$ 分别为两个串的左括号数量和右括号数量

假如 1 放在 2前面  那么对答案的贡献是 $min(R_1, L_2)$

假如 1 放在 2 后面 那么对答案的贡献是 $min(R_2, L_1)$

比较对答案的贡献,哪个答案贡献大,选哪种放置方式

如果读答案的贡献一样大,那么我们让左括号多的放前面 因为这样对后面的答案贡献大

Dup4:

 #include <bits/stdc++.h>

 using namespace std;

 #define N 100010

 struct node
{
int l, r;
inline node() {}
inline node(int l, int r) : l(l), r(r) {}
inline bool operator < (const node &b) const
{
int t1 = min(l, b.r), t2 = min(r, b.l);
return t1 > t2 || (t1 == t2 && (l > b.l));
}
}arr[N]; int t, n;
char s[N]; int main()
{
scanf("%d", &t);
while (t--)
{
int L = , R = , ans = , cnt = ;
scanf("%d", &n);
for (int i = ; i <= n; ++i)
{
scanf("%s", s);
int LL = , RR = ;
for (int j = , len = strlen(s); j < len; ++j)
{
if (s[j] == '(')
++LL;
else
{
if (LL)
{
--LL;
ans += ;
}
else
++RR;
}
}
if (LL && RR)
arr[++cnt] = node(LL, RR);
else if (LL) L += LL;
else R += RR;
}
sort(arr + , arr + + cnt);
for (int i = ; i <= cnt; ++i)
{
int LL = arr[i].l, RR = arr[i].r;
ans += min(L, RR) * ;
L -= min(L, RR);
L += LL;
}
ans += min(L, R) * ;
printf("%d\n", ans);
}
return ;
}

XHT:

 #include <bits/stdc++.h>

 using namespace std;

 #define N 100010

 struct node
{
int l, r;
inline node() {}
inline node(int l, int r) : l(l), r(r) {}
inline bool operator < (const node &b) const
{
if(l >= r && b.l < b.r)
return true;
if(l < r && b.l >= b.r)
return false;
if(l >= r && b.l >= b.r)
return r < b.r;
if(l < r && b.l < b.r)
return l > b.l;
}
}arr[N]; int t, n;
char s[N]; int main()
{
scanf("%d", &t);
while (t--)
{
int ans = ;
scanf("%d", &n);
for (int i = ; i <= n; ++i)
{
scanf("%s", s);
int LL = , RR = ;
for (int j = , len = strlen(s); j < len; ++j)
{
if (s[j] == '(')
++LL;
else
{
if (LL)
{
--LL;
ans += ;
}
else
++RR;
}
}
arr[i] = node(LL, RR);
}
sort(arr + , arr + + n);
int L = ;
for (int i = ; i <= n; ++i)
{
int LL = arr[i].l, RR = arr[i].r;
ans += min(L, RR) * ;
L -= min(L, RR);
L += LL;
}
printf("%d\n", ans);
}
return ;
}

C - Triangle Partition

水.(排序)

 #include<bits/stdc++.h>

 using namespace std;

 const int maxn = 1e3 + ;

 struct node{
int x, y, id;
inline node(){}
inline node(int x, int y, int id):x(x), y(y), id(id){}
inline bool operator < (const node &b) const
{
return x == b.x ? y < b.y : x < b.x;
}
}P[maxn << ]; int n; int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = ; i <= * n; ++i)
{
scanf("%d %d", &P[i].x, &P[i].y);
P[i].id = i;
}
sort(P + , P + + * n);
for(int i = ; i <= * n; i += )
{
printf("%d %d %d\n", P[i].id, P[i + ].id, P[i + ].id);
}
}
return ;
}

D - Distinct Values

按题意模拟即可。

 #include <bits/stdc++.h>

 using namespace std;

 #define N 100010

 struct node
{
int l, r;
inline void scan()
{
scanf("%d%d", &l, &r);
}
inline bool operator < (const node &r) const
{
return l < r.l || (l == r.l && this->r > r.r);
}
}Data[N]; int t, n, m;
int ans[N];
bool vis[N];
int R; int main()
{
scanf("%d", &t);
while (t--)
{
memset(ans, , sizeof ans);
R = ;
scanf("%d%d", &n, &m);
for (int i = ; i <= m; ++i) Data[i].scan();
sort(Data + , Data + + m);
for (int i = ; i <= m; ++i)
{
int l = Data[i].l, r = Data[i].r;
if (R >= r) continue;
if (R + < l)
for (int j = R + ; j < l; ++j) ans[j] = ;
memset(vis, false, sizeof vis);
for (int j = l; j <= R; ++j) vis[ans[j]] = true;
int L = ;
for (int j = max(R + , l); j <= r; ++j)
{
while (vis[L]) ++L;
ans[j] = L;
vis[L] = true;
}
R = max(R, r);
}
while (R < n)
{
R++;
ans[R] = ;
}
for (int i = ; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
}
return ;
}

E - Maximum Weighted Matching

留坑。

F - Period Sequence

留坑。

G - Chiaki Sequence Revisited

题意:定义$a_n$ 求 $\sum_{i = 1} ^ {i = n} a_i$

思路:先不考虑$a_1$

我们对每个最后一个2的幂次数处理出它前面有多少个数, 以及这些数的前缀和是多少

比如说处理出

1 2 4 8 16

1 3 7 15 31

1 5 20 76 288

然后给出n计算的时候 按二进制拆分 比如说

27 = 15 + 7 + 3 + 3

定义$F[i] 为 前面i个数的前缀和$

$ans[27] = F[15] + F[7] + 7 * 8 + F[3] + 3 * (8 + 2) + F[3] + 3 * (8 + 2 + 2)$

对于后面,相当于所有数向右偏移

注意取模

 #include <bits/stdc++.h>

 using namespace std;

 #define N 64
#define ll long long const ll MOD = (ll)1e9 + ; int t;
ll n;
ll a[N], b[N], c[N]; inline void Init()
{
a[] = ;
for (int i = ; i <= ; ++i) a[i] = a[i - ] << ;
b[] = ;
for (int i = ; i <= ; ++i) b[i] = (b[i - ] << ) + ;
c[] = ;
for (int i = ; i <= ; ++i) c[i] = ((c[i - ] << ) % MOD + (a[i - ] % MOD) * (b[i - ] % MOD) % MOD + a[i]) %MOD;
// for (int i = 0; i <= 59; ++i) printf("%lld %lld %lld\n", a[i], b[i], c[i]);
} int main()
{
Init(); scanf("%d", &t);
while (t--)
{
scanf("%lld", &n); --n;
ll ans = , tmp = ;
for (int i = ; i >= ; --i)
{
while (n >= b[i])
{
ans = (ans + c[i]) % MOD;
ans = (ans + (b[i] % MOD * tmp) % MOD) % MOD;
tmp = (tmp + a[i]) % MOD;
n -= b[i];
}
}
printf("%lld\n", ans);
}
return ;
}

H - RMQ Similar Sequence

留坑。

I - Lyndon Substring

留坑。

J - Turn Off The Light

留坑。

K - Time Zone

按题意模拟即可

 #include <bits/stdc++.h>

 using namespace std;

 int t, a, b;
char s[]; inline void work1()
{
int ans = ; int flag = ;
if (s[] == '-')
flag = -;
int len = strlen(s);
for (int i = ; i < len; ++i)
ans = ans * + s[i] - '';
ans *= flag;
int gap = ans - ;
a = (a + gap + ) % ;
printf("%02d:%02d\n", a, b);
return;
} inline void work2()
{
int A = , B = ; int flag = ;
if (s[] == '-')
flag = -;
int len = strlen(s), i;
for (i = ; s[i] != '.'; ++i)
A = A * + s[i] - '';
for (++i; i < len; ++i)
B = B * + s[i] - '';
int tot = a * + b;
A *= flag, B = B * * flag;
int tmptot = A * + B - ;
tot = (tot + tmptot + * ) % ( * );
printf("%02d:%02d\n", tot / , tot % );
return;
} int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d %d UTC%s", &a, &b, s);
bool flag = true;
for (int i = , len = strlen(s); i < len; ++i)
if (s[i] == '.')
{
flag = false;
break;
}
if (flag) work1();
else work2();
}
return ;
}

2018 Multi-University Training Contest 1 Solution的更多相关文章

  1. 2018 Multi-University Training Contest 2 Solution

    A - Absolute 留坑. B - Counting Permutations 留坑. C - Cover 留坑. D - Game puts("Yes") #include ...

  2. 2018 Multi-University Training Contest 3 Solution

    A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...

  3. 2018 Multi-University Training Contest 4 Solution

    A - Problem A. Integers Exhibition 留坑. B - Problem B. Harvest of Apples 题意:计算$\sum_{i = 0}^{i = m}C( ...

  4. 2018 Multi-University Training Contest 5 Solution

    A - Always Online Unsolved. B - Beautiful Now Solved. 题意: 给出一个n, k  每次可以将n这个数字上的某两位交换,最多交换k次,求交换后的最大 ...

  5. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  6. 2018 Multi-University Training Contest 7 Solution

    A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...

  7. 2018 Multi-University Training Contest 8 Solution

    A - Character Encoding 题意:用m个$0-n-1$的数去构成k,求方案数 思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时 ...

  8. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  9. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

随机推荐

  1. ionic函数 官方使用帮助

    项目里 lib/js/ionic.bundle.js 里很多ionic的函数,里面还带了很多使用示例,认真看一下肯定会对使用ionic有很多帮助啊!! 例如:$http

  2. oracle扩展dblink数。

    [标记]在进行数据迁移时:出现 Compilation errors for PROCEDURE ZDGAME.GFF_FETCH_MZR_LOG Error: ORA-04052: error oc ...

  3. java.lang.IncompatibleClassChangeError: Implementing class

    项目中使用了quartz,但是jar包却有两个,一个1.8版本,一个2.1版本,导致jar包冲突,所以导致一启动tomcat就出现: Caused by: java.lang.Incompatible ...

  4. ActiveMQ伪集群部署

    本文借鉴http://www.cnblogs.com/guozhen/p/5984915.html,在此基础上进行了完善,使之成为一个完整版的伪分布式部署说明,在此记录一下! 一.本文目的 介绍如何在 ...

  5. 虚拟机 搭建LVS + DR + keepalived 高可用负载均衡

    一:环境说明:   LVS-DR-Master:    10.3.0.82   LVS-DR-Backup:    10.3.0.70   VIP:                10.3.0.60  ...

  6. mac 类似Xshell

    ssh -t root@12.23.34.45 -p 22 ssh -t 用户名@IP地址 -p 端口

  7. 如何使用微信小程序制作banner轮播图?

    在前端工程师的工作中,banner是必不可少的,那缺少了DOM的小程序是如何实现banner图的呢?如同其他的框架封装了不同的banner图的方法,小程序也封装了banner的方法,来让我一一道来: ...

  8. IOS实例方法和类方法的区别

    类方法和实例方法   实例方法是— 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类. 在实例方法里,根据继承原理发送消息给self和super其实都是发送给s ...

  9. BNU4204:动物PK

    稀奇稀奇真稀奇,动物园摆出了擂台赛.小动物们纷纷上台比试,谁能获得最后的冠军呢? 动物园长发现小动物们打擂只与自身的三项属性有关:血量,攻击力和防御力.此外,小动物在赛前都为自己准备了一系列的攻击计划 ...

  10. oracle 字段自增 两段代码搞定

    (这几天做了个小小课程设计时用的是oracle数据库,第一次用,发现oracle和我们以前用的sql server .mysql是有如此多不同的地方,下面是遇到的问题之一和解决方法,和大家分享下) 用 ...