POJ 2709 贪心算法 测试数据生成程序

#include<iostream>
using namespace std;
//*****************算法变量************************//
const int Max=20;
int InputNum;//输入N值;
int InputArray[Max];//输入的颜料数目
int GrayNum;//灰色颜料的数量
int ColorNum;//需要的颜料盒数
//完成排序
inline void Swap(int Array[],int i,int j)
{
	int temp=Array[i];
	Array[i]=Array[j];
	Array[j]=temp;
}
void Sort(int Array[],int Size)
{
	int i,j;
	for(i=1;i<Size;i++)
	{
		for(j=Size-1;j>=i;j--)
		{
			if(Array[j]>Array[j-1])
			   Swap(Array,j,j-1);
		}
	}
}

int main()
{  
   while(true)
   {
   ColorNum=0;//谨记每次都要初始化
   scanf("%d",&InputNum);
   if(InputNum==0)
   { return 0;}
   for(int i=0;i<InputNum;i++)
   { scanf("%d",&InputArray[i]);}
   scanf("%d",&GrayNum);
   Sort(InputArray,InputNum);
   //从所需其他颜色的最大值计算份数
   if(InputArray[0]!=0)//要考虑到都是0的情况
   { ColorNum=(InputArray[0]+49)/50;}
   for(int i=0;i<InputNum;i++)
   {InputArray[i]=50*ColorNum-InputArray[i];}
   //调制灰色;按1ml递增来调制
   for(int i=1;i<=GrayNum;i++)
   {
	   Sort(InputArray,InputNum);
	   if(InputArray[2]==0)//如果颜料数量第三大已为0,那就加颜料
	   {
		   ColorNum++;
		   for(int i=0;i<InputNum;i++)
			   InputArray[i]+=50;
	   }
	   InputArray[0]--;
	   InputArray[1]--;
	   InputArray[2]--;
   }
   printf("%d\n",ColorNum);
   }
   return 0;
}
AC过的代码:
</pre><pre name="code" class="cpp">132K 0ms
</pre><pre name="code" class="cpp">容易出错的地方:
</pre><pre name="code" class="cpp">1.调制灰色颜料必须按1ML来调制
2.
ColorNum=0;//谨记每次都要初始化

!!!!每次循环一定要记得对结果进行初始化,不然就会Wrong

算法思路:先根据纯色颜料中的最大者求出至少需要的颜料盒数,然后用剩余的颜料来配gray,配的时候要1ml 1ml的配gray颜料,通过不断重新从大到小排序,每次从前三种颜料去1ml配出1mlgray颜料,配之前判断下第3种颜料是否还有剩余,没有就加1个颜料盒,以此类推,到gray颜料配足够为止。要注意判断一定要紧跟排序之后,防止减完第三种颜料为0误判,因为此时第4种颜料可能还剩余1ml

经验:

1.可以自己写测试数据到txt文件中,将测试数据输入到AC过的代码,和自己的代码进行对比。写的测试数据必须根据题意来写

本题的测试数据生成程序如下:

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

inline int Random(int x) //通过取余取得指定范围的随机数,0~x-1
{
	return (rand()%x);
}
int main()
{
 int N,k,G;
 ofstream fout("ceshi.txt");
 //生成100组测试数据
 for(int i=1;i<=100;i++)
 { 
	 do{ N=Random(12);}
	 while(N<3);
	 fout<<N<<" ";
   for(int j=1;j<=N;j++)
   {
     k=Random(1001);
	 fout<<k<<" ";
   }
   G=Random(1001);
   fout<<G<<" ";
   fout<<"\n";  
 }
 fout<<0<<" ";
 fout.close();
}

#define Random(x) (rand() % x) //通过取余取得指定范围的随机数
生成指定范围随机数的方法。


利用测试文件进行测试的源代码如下

#include"stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include<fstream>
using namespace std;
//*****************算法变量************************//
const int Max=20;
int InputNum;//输入N值;
int InputArray[Max];
int GrayNum;//灰色颜料的数量
int ColorNum;//需要的颜料盒数
inline void Swap(int Array[],int i,int j)
{
	int temp=Array[i];
	Array[i]=Array[j];
	Array[j]=temp;
}
void Sort(int Array[],int Size)
{
	int i,j;
	for(i=1;i<Size;i++)
	{
		for(j=Size-1;j>=i;j--)
		{
			if(Array[j]>Array[j-1])
			   Swap(Array,j,j-1);
		}
	}
}

int main()
{  
   fstream read("ceshi.txt");
   while(true)
   {
   ColorNum=0;
   /*scanf("%d",&InputNum);*/
   read>>InputNum;
   if(InputNum==0)
   { return 0;}
   for(int i=0;i<InputNum;i++)
   { /*scanf("%d",&InputArray[i]);*/
	 read>>InputArray[i];
   }
   /*scanf("%d",&GrayNum);*/
   read>>GrayNum;
   Sort(InputArray,InputNum);
   //从所需其他颜色的最大值计算份数
   if(InputArray[0]!=0)
   { ColorNum=(InputArray[0]+49)/50;}
   for(int i=0;i<InputNum;i++)
   {InputArray[i]=50*ColorNum-InputArray[i];}
   //调制灰色
   for(int i=1;i<=GrayNum;i++)
   {
	   Sort(InputArray,InputNum);
	   if(InputArray[2]==0)
	   {
		   ColorNum++;
		   for(int i=0;i<InputNum;i++)
			   InputArray[i]+=50;
	   }
	   InputArray[0]--;
	   InputArray[1]--;
	   InputArray[2]--;
   }
   printf("%d\n",ColorNum);
   }
   return 0;
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值