Codeforces1063D Candies for Children 【分类讨论】【暴力】

题目分析:

首先要想两个暴力,一个的时间复杂度是$O(n^2)$,另一个是$O([\frac{n}{k}])$的。

$n^2$的暴力可以枚举两段,一段有$i$个取两个的小朋友,一段有$j$个取两个的小朋友。

你就可以算出每轮选取他们的代价,假设为$alpha$和$beta$。你要做的只是解$ (x+1)*alpha+x*beta=k $,不难解决。

然后是$O([\frac{n}{k}])$的暴力,枚举选举的轮数,也就是上面的$x$。首先假设每个小朋友选一个糖果,然后问题变为小朋友选或不选糖果。

引入新参数$gamma$来表示现在你需要小朋友选的糖果数。

这样不难发现一组解是$(gamma,-gamma)$。然后两个解的选择范围为$[0 or 1,len1]$和$[0,len2]$。调一调就行了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 long long n,l,r,k;
 5
 6 long long func(long long x,long long y,long long ki,int dr,long long ll,long long rr){
 7     if(y == 0){
 8     if(ki == 0 && dr == -1) return -1;
 9     if(ki <= ll) return ki+rr;
10     else return -1;
11     }
12     long long a = ki,b = -ki;
13     long long hh = a/y;a %= y; b += hh*x;
14     if(a > ll) return -1;
15     if(dr == 1){
16     if(b < 0) return -1;
17     if(b <= rr)return b+a;
18     else {
19         hh = (b-rr)/x+((b-rr)%x!=0);
20         b -= hh*x;
21         a += hh*y;
22         if(a <= ll) return b+a;
23         else return -1;
24     }
25     }else{
26     if(a == 0) a += y,b -= x;
27     if(b < 0) return -1;
28     if(b <= rr) return b+a;
29     else {
30         hh = (b-rr)/x+((b-rr)%x!=0);
31         b -= hh*x;
32         a += hh*y;
33         if(a <= ll) return b+a;
34         else return -1;
35     }
36     }
37 }
38
39 int main(){
40     scanf("%I64d%I64d%I64d%I64d",&n,&l,&r,&k);
41     long long um = (r-l+n)%n;
42     l = 1; r = 1+um;
43     if(k/n <= 5e6){
44     long long len1 = r-l+1,len2 = n-len1;
45     long long ans = -1;
46     for(int i=0;i<=k/n;i++){
47         long long zeta = k-i*n-len1;
48         if(zeta>=0)ans = max(ans,func(i+1,i,zeta,1,len1,len2));
49         zeta = k+1-i*n-len1;
50         if(zeta>=0)ans = max(ans,func(i+1,i,zeta,-1,len1,len2));
51     }
52     printf("%I64d",ans);
53     }else{
54     int len1 = r-l+1,len2 = n-len1;
55     int ans = -1;
56     for(int i=0;i<=len1;i++){
57         for(int j=0;j<=len2;j++){
58         int alpha = len1+i,beta = len2+j;
59         long long zeta = k-alpha;
60         if(zeta % (alpha+beta) == 0) ans = max(ans,i+j);
61         }
62     }
63     k++;
64     for(int i=1;i<=len1;i++){
65         for(int j=0;j<=len2;j++){
66         int alpha = len1+i,beta = len2+j;
67         long long zeta = k-alpha;
68         if(zeta % (alpha+beta) == 0) ans = max(ans,i+j);
69         }
70     }
71     printf("%d",ans);
72     }
73     return 0;
74 }

原文地址:https://www.cnblogs.com/Menhera/p/9873516.html

时间: 2024-08-01 21:41:26

Codeforces1063D Candies for Children 【分类讨论】【暴力】的相关文章

cf 251 B Playing with Permutations 暴力 分类讨论

题链;http://codeforces.com/problemset/problem/251/B B. Playing with Permutations time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little Petya likes permutations a lot. Recently his mom has p

LA UVaLive 6862 Triples (数学+分类讨论)

题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数学题加分类讨论.首先对 x进行分类讨论. 当 0 = x 时,只要 y = z,就行,那么就有(m+1) *  (n-1) 个,因为 y 可能从0取到m ,j 可以从2取到 n. 当 0 != x 时,那么只要一个勾股定理能构成,只要幂大于2,就一下没解,所以我们把第一种中拿出j = 2时,的特殊情况,特殊考

【推导】【分类讨论】Codeforces Round #431 (Div. 1) B. Rooter&#39;s Song

给你一个这样的图,那些点是舞者,他们每个人会在原地待ti时间之后,以每秒1m的速度向前移动,到边界以后停止.只不过有时候会碰撞,碰撞之后的转向是这样哒: 让你输出每个人的停止位置坐标. ①将x轴上初始坐标记为(pi,0),y轴上的初始坐标记为(0,pi).只有pi-ti相同的才有可能发生碰撞.于是可以按照这一点将人划分为很多组,不同组之间绝对不会互相影响. ②假设一组内每个人都不会发生碰撞,那么所有的路线交叉点都是碰撞点.所以碰撞次数可能达到n^2次,暴力不可行. ③对于一组内,形成了一个网格图

【线段树】【分类讨论】水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店

dp+分类讨论 Gym 101128E

题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/details/61428924 Description n个小木条,一段前面有一个小箭头,给出第一个小木条的非箭头端端点横坐标以及每个小木条箭头端的坐标,现在要从下往上把这n'个木条按顺序叠放好,要求相邻两个小木条必须有一个共同端点且有交叠部分,问小木条有多少种放法 Input 第一行一整数n表示木条数量,之

BZOJ 1067 降雨量(RMQ+有毒的分类讨论)

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4399  Solved: 1182 [Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890, 则可以说

BZOJ 1099([POI2007]树Drz-9次线段树&amp;分类讨论+线段树与插入顺序维护2个参数)

1099: [POI2007]树Drz Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 142  Solved: 55 [Submit][Status] Description CDQZ是一个偏远的小学校,FGD在学校里中了一排树.他却不喜欢这些树的顺序,因为他们高高矮矮显得那么参差不齐. FGD定义这些树的不整齐程度为相邻两树的高度差的和.设树高分别为h1,h2,h3,-,hn.那么不整齐程度定义为:|h1-h2|+|h2-h3|+--+|hn

POJ 2826 An Easy Problem?!(线段相交,分类讨论)

题意:给两个线段,问他们能收集到多少雨水. 链接:http://poj.org/problem?id=2826 解法:分四种情况讨论 1. 存在一个线段与x轴平行,答案为0 2. 两个线段没有交点,答案为0 3. 1和2都不满足时,令线段1为比较低的那个线段,且p1为其比较高的那个点,若该点往y轴正方向的射线与线段2有交点,则答案为0 4. 3不满足时,求出两线段交点x1,p1做一条平行于x轴的线,该线与线段2的交点x2,则三角形x1, x2, p1的面积就是答案 小结:此题属于分类讨论型的题,

Codeforces 460D Little Victor and Set --分类讨论+构造

题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四个数(L,L+1,L+2,L+3),这样的话(L^(L+1)) ^ ((L+2)^(L+3)) = 0,最优 如果L不是偶数,那么看从L+1到R有没有四个数,如果有则取该四个数,否则最小异或和达不到0,也达不到1了,不再考虑k=4,k=3时还有可能等于0,所以转到k=3 2. k=3时,要使异或和为0,那