题目链接:http://codeforces.com/problemset/problem/369/B

题目意思:给出6个整数, n, k, l, r, sall, sk ,需要找出一个满足下列条件的序列:1、 l <= 每一个数 <= r   2、整个序列的数的和为sall       3、取得最高分数的那k个人的总分数恰好(注意,是刚刚好,多了或少了都不可,而且这k个人的分数不一定都是相等的)等于sk。(至于后面的那句 if a1, a2, ..... sk = a1 + a2 + ... + ak 本人觉得好像没有什么多大的用处)

wa足9次终于做出来了。一开始以为取得最高分,那么非r莫属,直接输出k 个 r 即可,接着下面的 (sallsk   )/ (n-k) 根据有无余数来继续。真的是大错特错啊~~陆陆续续修改,又没有考虑到 sall  sk

模拟题真的不是很难,但是要十分细心!

我的做法是,求k个人和n-k个人的分数的做法类似,所以可以写一个函数solve来解决。 以求k个人的分数为例,前面已经交代k个人的分数不一定完全相同,也就是说有余数(sk / k 不是恰好是整数,那么就要回溯,那么令 i = 1,即 sk / k  *  (k-i) (用p3表示),剩下的数为sk-p3 。试探它是否刚好能够除得尽 i,除此,还需要满足在[l,r]的范围,当找到第一个满足条件的i即可跳出循环。 至于求n-k个,稍稍有点不同的是,求出的商还需要满足比第一次调用求出的所有数要少(题目意思啊!),其实就是要小于两个数即可,即代码中的res1 和 res2

 #include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std; int n, k, l, r, sum, sumk, cnt, res1, res2; //cnt的使用是为了区别第一次的调用和第二次的调用 void solve(int p, int n)
{
int i, j, p1, p2, p3, p4, p5, flag = ;
cnt++;
p1 = p/n;
if (p % n)
{
for (i = ; !flag; i++)
{
p3 = p1 * (n - i);
p2 = p - p3;
if (p2 % i == )
{
p4 = p2 / i;
if (p4 <= r && p4 >= l)
{
if (cnt == ) // 第一次调用,求k个数
{
p5 = p4;
flag = ;
res1 = p5;
res2 = p1;
break;
}
else if (cnt == ) // 第二次调用,求n-k个数
{
if (p4 <= res1 && p4 <= res2) // 这个条件好关键,保证是比第一次调用所求出的所有数要少
{
p5 = p4;
flag = ;
break;
}
}
}
}
}
for (j = ; j < n-i; j++)
printf("%d ", p1);
for (j = ; j < i; j++)
{
if (flag)
printf("%d ", p5);
else
printf("%d ", p1);
}
}
else
{
if (cnt == )
res1 = res2 = p1; // 好关键的,有可能第一次调用k个人的分数完全相等
for (i = ; i <= n; i++)
printf("%d ", p1);
}
}
int main()
{
int t1, t2;
while (scanf("%d%d%d%d%d%d", &n, &k, &l, &r, &sum, &sumk) != EOF)
{
cnt = ;
solve(sumk, k);
if (sum != sumk) // 如果相等,没有必要调用第二次
{
t1 = sum - sumk;
t2 = n-k;
solve(t1, t2);
}
printf("\n");
}
return ;
}

简化后的代码(参考乌冬兄的代码,这就是差距啊~~~)

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std; int main()
{
int n, k, l, r, sall, sk, i;
while (scanf("%d%d%d%d%d%d", &n, &k, &l, &r, &sall, &sk) != EOF)
{
vector<int> res(n,l); //n个元素,每个元素初始值为l
sk -= k * l; //k个人分数之和的最大余数
sall -= n * l + sk; //n-k个人分数之和的最大余数
for (i = ; i < k; i++)
res[i] += sk/k; //有可能有余数的,所以后面要接着判断
for (i = ; i < sk%k; i++) //每一个都加,保证每个数都增长得最慢(有r限制)
res[i]++;
if (sall) //如果为0,说明剩下的n-k个人的分数都为l
{
for (i = k; i < n; i++) //注意是从k开始加,保证题目中所说的前k个人的分数是整个序列中最大的
res[i] += sall / (n-k);
for (i = k; i < k+sall%(n-k); i++)
res[i]++;
}
for (i = ; i < res.size(); i++)
printf("%d ", res[i]);
printf("\n");
}
return ;
}

codeforces B. Valera and Contest 解题报告的更多相关文章

  1. codeforces 441B. Valera and Fruits 解题报告

    题目链接:http://codeforces.com/problemset/problem/441/B 题目意思:有 n 棵fruit trees,每课水果树有两个参数描述:水果成熟的时间和这棵树上水 ...

  2. codeforces 441C. Valera and Tubes 解题报告

    题目链接:http://codeforces.com/problemset/problem/441/C 题目意思:将n * m 的矩阵分成 k 堆.每堆是由一些坐标点(x, y)组成的.每堆里面至少由 ...

  3. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  4. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

  5. Codeforces Round #382 (Div. 2) 解题报告

    CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...

  6. codeforces 556C. Case of Matryoshkas 解题报告

    题目链接:http://codeforces.com/contest/556/problem/C 题目意思:有 n 个数(1,2,...,n)组成 k 条链.第 i 条链由 mi 个数组成.每一秒只可 ...

  7. codeforces 507B. Amr and Pins 解题报告

    题目链接:http://codeforces.com/problemset/problem/507/B 题目意思:给出圆的半径,以及圆心坐标和最终圆心要到达的坐标位置.问最少步数是多少.移动见下图.( ...

  8. codeforces 500B.New Year Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 ...

  9. codeforces 493A. Vasya and Football 解题报告

    题目链接:http://codeforces.com/contest/493/problem/A 题目意思:给出两个字符串,分别代表 home 和 away.然后有 t 个player,每个playe ...

随机推荐

  1. 移动H5页面,keyup事件不好使用处理解决

    1.mouse事件换成touch,pointer事件,keyup换成textInput事件

  2. SQLServer错误:过程 sp_addextendedproperty,第 xxx 行对象无效。'dbo.xxx.xxx' 不允许有扩展属性,或对象不存在。

    上传数据库到虚拟主机,在执行SQL脚本的时候出现以下的错误: 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,第 37 行 对象无效.'dbo.Messag ...

  3. ping 和 traceroute 命令

    ping 和 traceroute 命令 ping 程序 就是发送一个ICMP查询报文给某服务器,以测试该服务器是否可达. 当返回ICMP回显应答时,要打印出序列号.TTL,和往返时间:   [roo ...

  4. HTML 5 websocket

    在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...

  5. .NET设计模式(2):单件模式(Singleton Pattern)(转载)

    概述 Singleton模 式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程 序在调用某一个类时,它是不 ...

  6. Hibernate unsaved-value 属性

    Session的saveOrUpdate方法是由Hibernate来判断被操作对象究竟是一个持久化对象还是临时自由状态对象.这需要在对象映射文件的主键id中定义unsaved-value属性,如果不显 ...

  7. 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

    一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码:   四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1. ...

  8. HTTP协议详解(一直在用可是这篇太好了转一下)

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  9. Android Studio 设置不自动缩进匿名内部类

    Android Studio 会默认缩进匿名内部类代码,这让人感觉有些不大适应,可以使用下面的方法进行取消. 取消选中橙色框前的几个复选框即可.

  10. JS设置cookie,删除cookie

    js设置cookie有很多种方法. 第一种:(这个是w3c官网的代码) <script> //设置cookie function setCookie(cname, cvalue, exda ...