[wikioi]均分纸牌
这是一道归为贪心题。。。http://wikioi.com/problem/1098/ 参考:http://www.cnblogs.com/taoziwel/articles/1859984.html
思路:
1.首先可以想到最终的结果是每一堆牌的数目一样,那么从最大往最小的去补,但这个顺序怎么弄好呢?一时不好想,因为有只能从左右两边补的限制。
2.这个时候想到从最左往右顺着来,一个一个解决了。多了就往右推,少了就从右补,但补的时候可能会出现右边的牌不够的情况。比如1,2,27。
3.这个时候想,先不管三七二十一,往下走吧。那么补完了可能出现负数,但是因为右边的牌肯定够多(否则avg就不是平均数了),“只是交换了移动的顺序而已”。
4.对于这个交换了移动的顺序,我是这么理解的,可以尝试把这个移动顺序算回来,是个递归的算法。那么当所剩牌为正的时候,就会把左边的小的(否则可能负的)先补上。
void CalcMoveOrder(i)
{
if () // after move, cards[i] > 0
{
// save step[i]
}
else
{
CalcMoveOrder(i+1);
}
}
5.再来两个例子用来理解:1,2,27,13,7。这个例子表示中间有可能会出现move完正好是avg的情况。
6. 27,2,1。这个是左边比右边大的情况。
最终的代码:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int cards[105];
int sum = 0;
for (int i = 0; i < n; i++)
{
cin >> cards[i];
sum += cards[i];
}
int avg = sum / n;
int move = 0;
for (int i = 0; i < n -1; i++)
{
if (cards[i] == avg) continue;
else
{
cards[i+1] += (cards[i] - avg);
cards[i] = avg;
move++;
}
}
cout << move << endl;
}
[wikioi]均分纸牌的更多相关文章
- wikioi 1098 均分纸牌
题目描述 Description 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...
- code vs 1098 均分纸牌(贪心)
1098 均分纸牌 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有 N 堆纸牌 ...
- NOIP200205均分纸牌
均分纸牌 描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张 ...
- NOIP2002 均分纸牌
题一 均分纸牌 (存盘名: NOIPG1) [问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为: ...
- 【洛谷p1031】均分纸牌
[博客园的第一条随笔,值得纪念一下] 均分纸牌[传送门] 洛谷上的算法标签是 这道题是一道贪心题,过了四遍才过(蒟蒻有点废) 第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值: 这 ...
- 洛谷P1368 均分纸牌(加强版)
P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...
- 洛谷P1031 均分纸牌
P1031 均分纸牌 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌 ...
- 洛谷 P1031 均分纸牌
P1031 均分纸牌 这道题告诉我们,对于实在想不出算法的题,可以大胆按照直觉用贪心,而且在考试中永远不要试着去证明贪心算法,因为非常难证,会浪费大量时间. (这就是你们都不去证的理由??) 这道题贪 ...
- 均分纸牌(Noip2002)
1320:[例6.2]均分纸牌(Noip2002) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 3537 通过数: 1839 [题目描述] 有n堆纸牌,编 ...
随机推荐
- Python(2.7.6) 特殊方法
在 Python 中有种特殊方法,也称为魔法方法.特殊方法的方法名的前后各有两个下划线,如__init__,这种拼写表示名字有特殊的意义.如果类实现了这些方法中的某一个,那么这个方法会在特殊的情况下被 ...
- 搭建eclipse+maven+scala-ide的scala web开发环境
http://www.tuicool.com/articles/NBzAzy 江湖传闻,scala开发的最佳利器乃 JetBrains 的神作 IntelliJ IDEA ,外加构建工具sbt 是也. ...
- ASP实现清除HTML标签,清除 空格等编码
'清除HTML格式 Function RemoveHTML(strText) Dim RegEx Set RegEx = New RegExp RegEx.Global = True '清除HTML标 ...
- 在ef下使用lambda实现left join
db.Categories .GroupJoin( db.Products, Category => Category.CategoryId, Product => Product.Cat ...
- CORS 跨域
跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性——CORS(Cross-Origin Resource Sh ...
- php正则贪婪匹配与非贪婪匹配一些例子
http://www.111cn.net/phper/210/55600.htm 贪婪模式匹配的原则是: 在可匹配也可不匹配的情况下, 优先匹配,直到不能匹配成功的情况下,记录备选状态,并把匹配控制交 ...
- java后台正则验证
public static boolean checkPhone(String phone) { Pattern pattern = Pattern.compile("^[1][3-8]+\ ...
- JavaScript基础-面向对象编程<1>
1.1 函数与对象 1.定义函数的方式定义类 定义类的方法: function class1(){ //类成员的定义及构造函数部分 } class1既是一个函数,也是一个类. 使用 new 操作符获 ...
- java多线程 join方法以及优先级方法
/*join:当A线程执行到了B线程的.join()方法时,A就会等待.等B线程都执行完,A才会执行. join可以用来临时加入线程执行. 1.线程使用join方法,主线程就停下,等它执行完,那么如果 ...
- bzoj2287:[POJ Challenge]消失之物
思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...