[题解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution
【题目】
【描述】
n个小朋友排排坐吃糖糖,小朋友从左到右编号1到n。每个小朋友手上有一定数量的糖。对于第i个小朋友来说,编号比他小的小朋友中有li个小朋友拥有的糖比他多,编号比他大的小朋友中有ri个小朋友拥有的糖比他多。已知每个小朋友手上至少有1颗糖、最多有n颗糖,求一种可能的每个小朋友手上的糖的数量的情形,输出YES和一种情形;如果不存在这样的可能,则输出NO。
数据范围:1<=n<=1000,0<=li,ri<=n
【思路】
对于第i个小朋友来说,有li+ri个小朋友比他的糖多,那么给他n-(li+ri)颗糖,即使那li+ri个比他糖多的小朋友拥有的糖的个数都不相同(即糖数分别为n-(li+ri)+1,...,n),也不会出现矛盾。按照这样的思路给大家发了糖之后,验证每个小朋友左右的比他糖多的小朋友的人数是否符合li和ri。如果符合,就输出该方案;否则,不存在可能的方案。
这道题我在比赛中没想出来【还想了好久好久……】,其实当时已经想到了,这实际上就是以“有多少人比自己糖多”给小朋友分组,但当时没想清楚怎么考虑左右关系。事实上,无论最终的分糖方案是什么,“得到相同数量的糖”的小朋友的分组都是一样的,对于每个小朋友进行检查li和ri就可以了。复杂度O(n^2)。
【我的实现】
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6
7 using namespace std;
8 #define MaxN 1020
9 //int L[MaxN], R[MaxN];
10 int ans[MaxN];
11
12 struct node
13 {
14 int L, R;
15 int Have;
16 }a[MaxN];
17
18 int main()
19 {
20 int n;
21 int i, j;
22 int iL, iR;
23 scanf("%d", &n);
24 for(i = 1; i <= n; i++)
25 scanf("%d", &a[i].L);
26 for(i = 1; i <= n; i++)
27 scanf("%d", &a[i].R);
28 for(i = 1; i <= n; i++)
29 a[i].Have = n - a[i].L - a[i].R;
30 for(i = 1; i <= n; i++)
31 {
32 iL = 0;
33 for(j = 1; j < i; j++)
34 if(a[j].Have > a[i].Have)
35 iL++;
36 iR = 0;
37 for(j = i + 1; j <= n; j++)
38 if(a[j].Have > a[i].Have)
39 iR++;
40 if(iL != a[i].L || iR != a[i].R)
41 {
42 printf("NO\n");
43 return 0;
44 }
45 }
46 printf("YES\n");
47 for(i = 1; i <= n; i++)
48 printf("%d ", a[i].Have);
49 return 0;
50 }
【评测结果】

[题解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution的更多相关文章
- [题解]Mail.Ru Cup 2018 Round 1 - D. Changing Array
[题目] D. Changing Array [描述] 给n个整数a[1],...,a[n],满足0<=a[i]<=2^k-1.Vanya可以对这n个数中任一多个数进行操作,即将x变为x' ...
- [题解]Mail.Ru Cup 2018 Round 1 - B. Appending Mex
[题目] B. Appending Mex [描述] Ildar定义了一种方法,可以由一个数组产生一个数.具体地,从这个数组中任选一个子集,不在这个子集中的最小的非负整数称为mex,就是由这个数组得到 ...
- [题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?
[题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升 ...
- [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]
https://codeforces.com/contest/1056/problem/B 题意:输入n,m 求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...
- 【Mail.Ru Cup 2018 Round 2 A】 Metro
[链接] 我是链接,点我呀:) [题意] [题解] 1:一直往右走的情况. 2:中间某个地方中转 (不会出现超过1次的转弯. (如果超过了和1次是等价的 [代码] #include <bits/ ...
- 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser
[链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...
- 【Mail.Ru Cup 2018 Round 2 C】 Lucky Days
[链接] 我是链接,点我呀:) [题意] [题解] 题解的作者: manish_joshi 对于任意一个k 因为那条直线(关于x,y的方程可以看出一条直线)的斜率>= 所以肯定会经过第一象限. ...
- Mail.Ru Cup 2018 Round 2 C. Lucky Days(拓展欧几里得)
传送门 待参考资料: [1]:https://www.cnblogs.com/Patt/p/9941200.html •题意 a君,b君存在幸运周期: a君在第[ L1+k·t1,R1+k·t1]天为 ...
- Mail.Ru Cup 2018 Round 3 B. Divide Candies
题目链接 分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,ji,ji,j的方案数; 即(i2+j2)mod   m=0 (n ≤ ...
随机推荐
- 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)
问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...
- HBase之MinorCompact全程解析
转自:https://blog.csdn.net/u014297175/article/details/50456147 Compact作用 当MemStore超过阀值的时候,就要flush到HDFS ...
- elementui表格里面的索引,多选的复用解决
使用elementui表格时,当一个页面通过if判断有多个不同的表格时,其中一个或多个表格想要设置索引或者多选框时,会发现你在第一个里面设置了索引或者多选框,其他的表格都会出现,你在后面的其中一个设置 ...
- Android开发之事件
当按下一个按钮时,有两种事件促发的方式,一种是通过回调,一种是通过事件监听. 回调: xml中: 只要设置android:onclick="回调函数名字" '主函数中重写回调函数即 ...
- C++虚函数和静态函数调用方式
简单情况: #include<iostream> using namespace std; class A { public: virtual void foo() { cout < ...
- golang中的标准库strconv
strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...
- java 中的多线程简单介绍
package com.zxf.demo; /* * 多线程的实现方式两种? * 一..实现 runnable 接口 * 2.重写run方法 Run():当一个线程启动后,就会自动执行该方法 * 3. ...
- k8s-基础篇
搭建k8s环境 Myapp镜像部署扩容pod自愈负载均衡DNS外网访问滚动更新YAML方式部署独立部署podRS副本控制器Deployment-自动扩容Deployment-更新版本Deploymen ...
- (DDS)正弦波形发生器——幅值、频率、相位可调(二)
(DDS)正弦波形发生器--幅值.频率.相位可调(二) 主要关于调相方面 一.项目任务: 设计一个幅值.频率.相位均可调的正弦波发生器. 频率每次增加10kHz 相位每次增加 PI/2 幅值每次增加两 ...
- bom-删除提示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...