Loading

NOIP2002提高組 均分紙牌

2011年10月09日 02:49

[问题描述]
有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

例如 N=4,4 堆纸牌数分别为:
① 9 ② 8 ③ 17 ④ 6
移动3次可达到目的:
从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

[输 入]
N(N 堆纸牌,1 <= N <= 100)
A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)

[输 出]
输出至屏幕。格式为:
所有堆均达到相等时的最少移动次数。‘

[输入输出样例]
4
9 8 17 6

[输入输出样例]
3

解析見http://www.byvoid.com/blog/noip-allsolutions/

 

#include <iostream>
#include <cstdio>
using namespace std;

int N,avg,ans;
int S[101];

int main()
{
    int i;
    freopen("jfzp.in","r",stdin);
    freopen("jfzp.out","w",stdout);
    cin >> N;
    for (i=1;i<=N;i++)
    {
        cin >> S[i];
        avg+=S[i];
    }
    avg/=N;
    for (i=1;i<N;i++)
    {
        if (S[i]!=avg)
        {
            S[i+1]+=S[i]-avg;
            S[i]=avg;
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

正在连接评测机...

 

已连接到评测机

GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty

正在编译...

编译成功

 

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 20 0.030 s 273 KB 0
2 正确 20 0.002 s 273 KB 0
3 正确 20 0.011 s 273 KB 0
4 正确 20 0.001 s 273 KB 0
5 正确 20 0.001 s 273 KB 0

运行完成

运行时间 0.045 s

平均内存使用 273 KB

测试点通过状况 AAAAA

得分:100

恭喜你通过了全部测试点!

Tags: NOIP c++ 貪心
评论(1) 阅读(5140)

NOIP2004提高組 合併果子

2011年10月08日 03:26

【问题描述】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
【输入文件】
输入文件fruit.in包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。
【输出文件】
输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。
【样例输入】
3
1 2 9
【样例输出】
15
【数据规模】

对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。

【分析】

貪心,每次找到最小的兩堆果子進行合併。

不要把本題看成石子歸併。

我用的是鏈表,全過了,但是速度較慢~

#include <fstream>
using namespace std;	
ifstream fin("fruit.in");
ofstream fout("fruit.out");
class data
{
public:
	int key;
	//Other members HERE...
	int sen;//前驱
	int next;//后继
};
data A[200000];
int top;//链表中元素的个数

void Insert(int key)
{
	int point=0;
	while (key>A[point].key)
	{
		point=A[point].next;
	}
	//Create a new node
	A[top].key=key;
	A[top].next=point;
	A[top].sen=A[point].sen;
	
	A[point].sen=top;//后继的前驱等于自己
	
	A[A[top].sen].next=top;//前驱的后继等于自己
	
	top++;
}

void DeleteOne(int key)
{
	int point=A[0].next; 
	while(A[point].next!=-1)
	{
		if(A[point].key==key)
		{
			A[A[point].sen].next=A[point].next; //自己前驱的后继等于自己的后继
			A[A[point].next].sen=A[point].sen;  //自己后继的前驱等于自己的前驱
			return; //跳出函数
		}
		point=A[point].next;
	}
}

void print()
{
	int point=A[0].next; 
	while(A[point].next!=-1)
	{
		fout<<A[point].key<<endl;
		point=A[point].next;
	}
}
void debug()
{
	for (int i=0;i<top;i++)
		fout<<i<<" "<<A[i].key<<" "<<A[i].sen<<" "<<A[i].next<<endl;
}

int GetMinElem()
{
	int point=A[0].next;
	return A[point].key;
}

int main()
{

	//Initialize
	A[0].key=-1;A[0].next=1;A[0].sen=-1;
	A[1].key=0Xfffffff;A[1].next=-1;A[0].sen=0;
    top=2;
	int num,key;
	fin>>num;
	for (int i=0;i<num;i++)
	{
		fin>>key;
		Insert(key);//插入一个关键字
	}
	
	int liu=num;
	int cost=0;
	//debug();
	while (liu!=1)
	{
		int m=GetMinElem();
		DeleteOne(m);
		int n=GetMinElem();
		DeleteOne(n);
		//fout<<m<<" "<<n<<endl<<endl;
		cost+=(m+n);
		Insert(m+n);
		liu--;
	}
	//print();
	fout<<cost<<endl;
	return 0;
}

 

正在连接评测机...

 

已连接到评测机

GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty

正在编译...

编译成功

 

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 10 0.000 s 2614 KB 0
2 正确 10 0.002 s 2614 KB 0
3 正确 10 0.002 s 2614 KB 0
4 正确 10 0.043 s 2614 KB 0
5 正确 10 0.096 s 2614 KB 0
6 正确 10 0.403 s 2614 KB 0
7 正确 10 0.503 s 2614 KB 0
8 正确 10 0.396 s 2614 KB 0
9 正确 10 0.500 s 2614 KB 0
10 正确 10 0.508 s 2614 KB 0

运行完成

运行时间 2.453 s

平均内存使用 2614 KB

测试点通过状况 AAAAAAAAAA

得分:100

恭喜你通过了全部测试点!

 

Tags: noip 貪心 c++
评论(1) 阅读(1451)