ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dreamoon Likes Coloring 【CF 1329 A】

2020-12-31 21:04:29  阅读:249  来源: 互联网

标签:pre now Coloring 染色 SUM 1329 len Likes include


传送门

思路:“Dreamoon will choose a number pipi from range [1,n−li+1](inclusive) and will paint all cells from pipi to pi+li−1(inclusive) in ii-th color.”可以知道从[1, n - li - 1]任意位置往后染pi个格子为第ith种颜色。

容易想到,如果∑li < n,说明"-1"。

如果∑li>=n,因为我们不知道怎么染色才好,但我们知道SUM = ∑li,即我们目前还可以染色SUM块。不如我们类贪心的思想染色,这样我们可以分成两种情况:

假设now为当前的pi,len为剩余未染色的块

①SUM - now >= len - 1

说明我们只用当前颜色染色1块,之后SUM-now的个数也可以染色剩余的部分,那么 SUM -= now ,len -= 1

②SUM - now < len - 1

说明我们如果用当前颜色只染色1块,则SUM - now 不能染色剩余的 len - 1,那么我们需要让

SUM - now == len - 1 - ? (==>) ? = (len - 1) - (SUM - now),则当前颜色需要染色 ? + 1个才行。SUM -= now, len -= (1 + ?)

这样我们可以用pre_s,pre_d记录之前的开始位置和染色长度。

当然我们不能忘记一个条件“每种颜色只能在[1, n - li - 1]开始往后染色”,如果(n - li - 1) < pre_s + pre_d,

说明我们无法完成满足题意的染色,因为我们前面是尽可能少的染色且满足题目要求,如果仍然无法满足,说明没有可行解。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <queue>
 7 #include <vector>
 8 #include <cstring>
 9 #include <functional>
10 #define LL long long
11 using namespace std;
12 
13 const int N = 1e5 + 10;
14 int L[N], inx[N];
15 
16 void solve ()
17 {
18     int n, m, len;
19     scanf("%d%d", &n, &m);
20 
21     LL Sum_d = 0;
22     for(int i = 1; i <= m; ++i) {
23         scanf("%d", L + i);
24         Sum_d += L[i];
25     }
26 
27     int pre_s, pre_d;
28     pre_s = 1; pre_d = 0;
29     len = n;
30     for(int i = 1; i <= m; ++i) {
31         //printf("start = %d  L = %d\n", pre_s + pre_d, n - L[i] + 1);
32         if(n - L[i] + 1 < pre_s + pre_d) { break; }
33 
34         if(Sum_d - L[i] >= len - 1) {
35             Sum_d -= L[i];
36             len -= 1;
37             pre_s = pre_s + pre_d;
38             pre_d = 1;
39         } else {
40             int tmp_d = (len - 1) - (Sum_d - L[i]);
41             if(tmp_d + 1 > L[i]) { break; }
42             Sum_d -= L[i];
43             len -= (1 + tmp_d);
44             pre_s = pre_s + pre_d;
45             pre_d = (1 + tmp_d);
46         }
47         inx[i] = pre_s;
48     }
49 
50    // cout << "len = " << len << endl;
51 
52     if(len > 0) {
53         printf("-1\n");
54     } else{
55         for(int i = 1; i <= m; ++i) { printf("%d ", inx[i]); }
56         printf("\n");        
57     }
58 
59 
60 }
61 
62 int main()
63 {
64     solve();
65 
66     return 0;
67 }

 

标签:pre,now,Coloring,染色,SUM,1329,len,Likes,include
来源: https://www.cnblogs.com/SSummerZzz/p/14218586.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有