XTUOJ 15503 - C

15503 - C

Accepted: 6    Submissions: 27    Time Limit: 3000 ms    Memory Limit: 1048576 KB

在解决了小女孩的谜题后,小女孩很大方的告诉了deemo她的名字:Alice。
从此deemo不再孤单一人了。他们每天快乐的生活在一起。deemo平时喜欢弹钢琴,Alice会静静的坐在他的身边,看deemo以前看过的书。

“deemo,你的书里的谜题都好难啊。”Alice歪着脑袋愁眉苦脸的看着书。
“想知道答案可以问我,我都解决了。”deemo的琴声欢快了起来。
“真的?这么厚的一本书?,那这题你知道答案吗?”
“嗯,因为在你来之前,我都是一个人。”

谜题:
n个人在玩一个关于蜡烛的游戏。这些人编号为1,2,…,n。一开始,第i个人有ai根蜡烛在手上。
这个游戏进行m轮。在每一轮,蜡烛最少的人可以获得x根蜡烛。如果有多于两个人有最少的蜡烛,则编号最小的人获得蜡烛。
编号为1的是他们的老大。所以他可以在游戏开始前从其他途径多获得y根蜡烛。现在他想知道他在m轮之后最多可以拥有多少根蜡烛。

Input
一个整数t,表示样例个数($t\leq 10$)。每组样例第一行有四个整数 $n,m,x,y (1\leq n,m\leq 200000,1\leq x,y\leq 10^9)$.第二行有n个整数 $a_1,a_2,…,a_n (1\leq a_i\leq 10^9)$.

Output
每组样例一个整数表示蜡烛的最大数量。

Input
1
2 1 2 2
1 2

Output
4

Source

XTU OnlineJudge

解题:假设不把$a_0$放进去,我们可以通过x和y使得a[0]等于剩余的某个数的现在的值,这样搞下去即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 200010;
 4 typedef long long LL;
 5 typedef pair<LL,int> PLI;
 6 priority_queue<PLI,vector<PLI >,greater<PLI > >p,q;
 7 int cnt[maxn],n,m,x,y;
 8 LL a[maxn];
 9 LL solve(int st,LL ret = 0) {
10     while(!q.empty()) q.pop();
11     while(!p.empty()) p.pop();
12     memset(cnt,0,sizeof cnt);
13     for(int i = 1; i < n; ++i) {
14         q.push(PLI(a[i],i));
15         p.push(PLI(a[i],i));
16     }
17     p.push(PLI(a[0] + st,0));
18     ret = a[0];
19     for(int i = 0; i < m; ++i) {
20         PLI now = q.top();
21         q.pop();
22         if(now.first >= a[0]){
23             LL k = ceil(double(now.first - a[0] - y)/x);
24             if(i + max(k,0LL) + 1 <= m && a[0] + k*x <= now.first)
25                 ret = max(ret,now.first + x);
26         }
27         now.first += x;
28         q.push(now);
29     }
30     ret = max(ret,a[0] + st);
31     for(int i = 0; i < m; ++i) {
32         PLI now = p.top();
33         now.first += x;
34         p.pop();
35         if(now.second == 0) ret = max(ret,now.first);
36         p.push(now);
37     }
38     return ret;
39 }
40 int main() {
41     int kase;
42     scanf("%d",&kase);
43     while(kase--) {
44         scanf("%d%d%d%d",&n,&m,&x,&y);
45         for(int i = 0; i < n; ++i) scanf("%I64d",a + i);
46         if(n == 1) {
47             printf("%I64d\n",LL(m)*x + (a[0] + y));
48             continue;
49         }
50         printf("%I64d\n",solve(y));
51     }
52     return 0;
53 }
54 /*
55 1
56 5 4 8 4
57 1 5 5 7 8
58 */

时间: 2024-10-09 18:19:35

XTUOJ 15503 - C的相关文章

XTUOJ 1206 Dormitory&#39;s Elevator

Dormitory's Elevator Time Limit : 1000 MS   Memory Limit : 65536 KB Problem Description The new dormitory has N(1≤N≤100000) floors and M(1≤M≤100000)students. In the new dormitory, in order to save student's time as well as encourage student exercise,

XTUOJ 1142 Collatz Conjecture(数论)

昨天一开始就看中了这个题,觉得这道题可以做,然后就按照思路一直写下去,测试了一下数据,开始后面那个最大值总是等于0,(这也算是这道题最坑爹的地方了),然后就把最大值置成了a的值,然后再测试了一下数据就全部都通过了,后来,我们灵光一闪,把int全换成了longlong,然后,我们就提交了,开始感觉这道题会超时,后来等了一会,竟然就ac了,我们就都好激动了.1a对我们这种菜鸟队来说算挺不错的啦,这也就给了我们极大的自信心,我们就一直往后面做,就去做那道字符串的题. 今天又进一步去程序优化了一下,比昨

XTUOJ 1144 Echo(字符串的处理)

这道题算是一道简单的字符串题,应该算是签到题吧,这种题是一定要做出来的,这道题要注意的就是空格的处理,输入输出空格的处理,字符串类问题中连续输入的时候一定要特别注意,昨天是用c++写的,感觉c++处理字符串问题比c语言要好一点,这里我感觉用c语言一样的很简便: #include <stdio.h> #include <string.h> int main() { int t,l; char s[4100]; scanf("%d",&t); getchar

XTUOJ 1176 I Love Military Chess(模拟)

 I Love Military Chess Accepted : 45   Submit : 141 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 陆军棋,又称陆战棋,简称军棋,是中国近代的一种两人棋类,设计根据军队中的军阶.每一方有25枚棋子,先夺得对方军旗者为胜. 棋子 每一方的棋子为25枚,包括: 军阶高低 棋子名称 各方枚数 特殊能力 1 司令 1 无 2 军长 1 无 3 师长 2 无 4 旅长 2 无 5 团长 2 无

XTUOJ 1173 Five Tiger(模拟)

 Five Tiger Accepted : 34   Submit : 107 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 五虎棋是流传在东北民间的一种游戏,GG小的时候,经常被表哥虐得很惨. 由于各个地区的规则可能不大相同,并且GG的回忆不一定很准,所以,如果规则和你平常玩的的有冲突,请以这里为主. 棋盘是横五条,纵五条直线,形成25个交叉点,双方轮流把棋子放到交叉点上 (由于所需各自和棋子数目不多,才12+13,GG小的时候,

XTUOJ 1140 Anti-Goldbach&#39;s Conjecture(数论)

链表中结点的分配和回收是由系统提供的标准函数malloc和free动态实现的,称之为动态链表. 如果程序支持指针,则可按照我们的一般形式实现链表, 需要时分配,不需要时回收即可. 动态链表的空间是可以动态扩展的. typedef struct  node{ EleType data; struct node * pNext; }Node; 有些高级语言中没有"指针"数据类型,只能用数组来模拟线性链表的结构, 数组元素中的指针"域"存放的不是元素在内存中的真实地址,而

XTUOJ 1248 TC or CF 搜索

这个题一眼看上去不会 然后有人说是网络流 然后我就想怎么建图啊,然后不会(是本蒟蒻太垃圾了),肯定有网络流解法 然后去群里问了gdut的巨巨,他说他队友爆搜+剪枝过了(我也是非常的叹服) 然后我也写了一个2^50的搜索剪枝,居然真过了(不知道是数据弱还是大力出奇迹) #include <cstdio> #include <iostream> #include <ctime> #include <vector> #include <cmath> #

XTUOJ 1205 Range

Range Time Limit : 1000 MS Memory Limit : 65536 KB Problem Description For an array, the range function is defined below: Range(A)=Max(A)-Min(A)+1; For example, suppose A={1,2,3,4,5}, then Range(A)=5-1+1=5. Now, given an array A(length≤100000), you a

xtuoj A+B Again(在某个数中找大于m的最小约数)

新生赛: Accepted : 15   Submit : 243 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 上次趣味赛小明的a+b坑了不少不喜欢思考的同学,小明为了表示歉意, 这次出了道简单的a+b给大家当签到题,希望大家能开心刷题. 那么,题目来了!!! 求使得b/(a+x)为整数的最小正整数x的值. 输入 第一行是一个整数K(K≤10000),表示样例的个数. 以后每行一个样例,为两个正整数a,b(1≤a,b≤108). 输出