poj 1009

写了3天,RE3次,10k的代码你敢信。。。折腾死了

最后还是钻了空子,假设n>100000的就只有一行。实在没想出好的解决办法。

0MS还是挺值得高兴的,挤进poj前500~

回头看看别人的代码。

// Problems.cpp : 定义控制台应用程序的入口点。
//

//#define DEBUG

#include <iostream>
#include <iomanip>
#include <string>
#include <math.h>
using namespace std;

//#include "poj.h"

#ifdef DEBUG

#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
#endif



int main()
{
#ifdef DEBUG
	Stopwatch ^ stopWatch;
	
	stopWatch = Stopwatch::StartNew();
	freopen("d:/data.txt","r",stdin);  
	freopen("d:/out.txt","w",stdout);  
#endif

// function code

	int n;
	
	while(cin>>n, n!=0)
	{
		cout<<n<<endl;
		int i,j,pix,c,index = 0;
		int begin_flag = 1;
		int max = 0,tmp,tmp2,tmp3;
		int number = -1,count=0;

		if(n == 1 || n > 100000){
			int a = -1,b = -1;count = -1;

			while(cin>>pix, cin>>c, pix!=0 || c!= 0)
			{
				if(c > 2){
					//handle 0s
					if(a == -1){
						a = pix;
						b = pix;
						number = 0;
						count = c - 1;
					}
					else if(b == -1){
						number = abs(a - pix);
						cout<<number<<" "<<1<<endl;
						a = pix;
						b = pix;
						number = 0;
						count = c - 2;
					}else{
						tmp = abs(a - b);
						tmp2 = abs(a - pix);
						number = tmp > tmp2?tmp:tmp2;
						if(number == max){count ++;}
						else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
						number = number > tmp2? number:tmp2;
						if(number == max){count ++;}
						else{ count = 1;}
						cout<<number<<" "<<count<<endl; 

						a = pix;
						b = pix;
						number = 0;
						count = c - 2;
					}
				}
				else if(c == 1){
					if(a == -1){a = pix;number = 0;continue;}
					if(b == -1){
						b = a; 
						a = pix;
						number = abs(b-a);
						count = 1;
						continue;
					}
					tmp = abs(b-a);
					tmp2 = abs(a-pix);
					max = tmp > tmp2 ? tmp:tmp2;
					if(number == max){count ++;}
					else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
					b = a;
					a = pix;
					continue;
				}else if(c == 2)
				{
					if(a == -1){a = pix; b = pix; number = 0; count = 1; continue;}
					if(b == -1){
						b = pix; 
						number = abs(b-a);
						a = pix;
						count = 1;
						continue;
					}
				}
				
			}//while n = 1
			if(count == -1)cout<<number<<" "<<1<<endl;
			else{
				max = abs(b-a);
				if(number == max){count ++;}
				else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
				cout<<number<<" "<<count<<endl;
			}
			cout<<0<<" "<<0<<endl;
			continue;
		}

	
		

		int* image = NULL;
		image = (int*) malloc(sizeof(int) * (n * 3));
		//image = new int[n*2];
		

		
		while(cin>>pix,cin>>c, pix!=0 || c != 0)
		{
			//handle same pixels
			if(c >= 5 * n + 2)
			{
				int n1 = 3 * n + 1; //before 0s
				int n2 = (c - n1 - 1) % n + n + 1;//behind 0s
				int x = (c - n1 - n2) / n;
				
				for(i = 0; i < n1; i++)
				{


					image[index] = pix;
					//the first line
					if(begin_flag && index > n)
					{
						max = 0;
						//left
						if(index > (n + 1)){
							tmp = abs(image[index-2]-image[index-n-1]);
							tmp2 = abs(image[index-2-n] - image[index-n-1]);
							max = tmp > tmp2 ? tmp:tmp2;
						}
						//right & up
						if(index < 2 * n ){
							tmp = abs(image[index - n - 1]-image[index]);
							tmp2 = abs(image[index - n - 1] - image[index - n]);
							max = tmp>max? tmp:max;
							max = tmp2>max? tmp2:max;
							
							tmp = abs(image[index - 1] - image[index - n - 1]);
							max = tmp>max? tmp:max;
						}
						if(number == -1)number = max;
						if(number == max){count ++;}
						else{cout<<number<<" "<<count<<endl; number = max; count = 1;}

						//last element
						if(index == (2 * n - 1)){
							begin_flag = 0;
							//left
							
							tmp = abs(image[index-1]-image[index-n]);
							tmp2 = abs(image[index-1-n] - image[index-n]);
							max = tmp > tmp2 ? tmp:tmp2;
							
							tmp = abs(image[index] - image[index - n]);
							max = tmp>max? tmp:max;
							if(number == -1)number = max;
							if(number == max){count ++;}
							else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
						}
					}

					if(index > 2 * n && (index % n) > 0)
					{
						max = 0;
						//left
						if(index % n > 1){
							tmp = abs(image[index-2]-image[index - n - 1]);
							tmp2 = abs(image[index-2-n] - image[index - n - 1]);
							tmp3 = abs(image[index - 2- 2 * n] - image[index - n - 1]);
							max = tmp > tmp2 ? tmp:tmp2;
							max = tmp3 > max ? tmp3:max;
						}
						
						//right
						tmp = abs(image[index]-image[index - n - 1]);
						tmp2 = abs(image[index - n] - image[index - n - 1]);
						tmp3 = abs(image[index - 2 * n] - image[index - n - 1]);
						max = tmp > max? tmp:max;
						max = tmp2 > max ? tmp2:max;
						max = tmp3>max? tmp3:max;

						//up
						tmp = abs(image[index - n - 1] - image[index - 2 * n - 1]);
						max = tmp>max? tmp:max;
						//down
						tmp = abs(image[index - n - 1] - image[index - 1]);
						max = tmp>max? tmp:max;
						if(number == -1) number = max;
						if(number == max){count ++;}
						else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
						
						if(index == (n*3-1))
						{
							int tpix = image[index - n];
							//left
							tmp = abs(image[index - 1]-tpix);
							tmp2 = abs(image[index - 1 - n] - tpix);
							tmp3 = abs(image[index - 1 - 2 * n] - tpix);
							max = tmp > tmp2 ? tmp:tmp2;
							max = tmp3 > max ? tmp3:max;

							//up
							tmp = abs(tpix - image[index - 2 * n]);
							max = tmp>max? tmp:max;
							//down
							tmp = abs(tpix - image[index]);
							max = tmp>max? tmp:max;
							if(number == -1) number = max;
							if(number == max){count ++;}
							else{cout<<number<<" "<<count<<endl; number = max; count = 1;}

							//rearrange image
							for(j = 0; j < 2*n; j++)
							{
								image[j] = image[j+n];
							}
							index = 2*n-1;
						}
					}
					index ++;



				}//for i < n1
				if(number == -1)number = 0;
				if(number == max){count +=x * n;}
				else{cout<<number<<" "<<count<<endl; number = max; count = x * n;}
				c = n2;
			}

			

			for(i = 0; i < c; i++)
			{
				image[index] = pix;
				//the first line
				if(begin_flag && index > n)
				{
					max = 0;
					//left
					if(index > (n + 1)){
						tmp = abs(image[index-2]-image[index-n-1]);
						tmp2 = abs(image[index-2-n] - image[index-n-1]);
						max = tmp > tmp2 ? tmp:tmp2;
					}
					//right & up
					if(index < 2 * n ){
						tmp = abs(image[index - n - 1]-image[index]);
						tmp2 = abs(image[index - n - 1] - image[index - n]);
						max = tmp>max? tmp:max;
						max = tmp2>max? tmp2:max;

						tmp = abs(image[index - 1] - image[index - n - 1]);
						max = tmp>max? tmp:max;
						if(number == -1)number = max;
						if(number == max){count ++;}
						else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
					}
					
					
					
					//last element
					if(index == (2 * n - 1)){
						begin_flag = 0;
						//left
						if(index > (n + 1)){
							tmp = abs(image[index-1]-image[index-n]);
							tmp2 = abs(image[index-1-n] - image[index-n]);
							max = tmp > tmp2 ? tmp:tmp2;
						}

						tmp = abs(image[index] - image[index - n]);
						max = tmp>max? tmp:max;
						if(number == -1)number = max;
						if(number == max){count ++;}
						else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
					}
				}
				

				if(index > 2 * n && index % n > 0)
				{
					max = 0;
					int tpix = image[index - n - 1];
					//left
					if(index % n > 1){
						tmp = abs(image[index - 2] - tpix);
						tmp2 = abs(image[index - 2 - n] - tpix);
						tmp3 = abs(image[index - 2 - 2 * n] - tpix);
						max = tmp > tmp2 ? tmp:tmp2;
						max = tmp3 > max ? tmp3:max;
					}
					//right
					tmp = abs(image[index] - tpix);
					tmp2 = abs(image[index - n] - tpix);
					tmp3 = abs(image[index - 2 * n] - tpix);
					max = tmp > max? tmp:max;
					max = tmp2 > max ? tmp2:max;
					max = tmp3>max? tmp3:max;

					//up
					tmp = abs(tpix - image[index - 2 * n - 1]);
					max = tmp>max? tmp:max;
					//down
					tmp = abs(tpix - image[index - 1]);
					max = tmp>max? tmp:max;
					if(number == -1) number = max;
					if(number == max){count ++;}
					else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
					
					if(index == (n*3-1))
					{
						tpix = image[index - n];
						//left
						tmp = abs(image[index - 1]-tpix);
						tmp2 = abs(image[index - 1 - n] - tpix);
						tmp3 = abs(image[index - 1 - 2 * n] - tpix);
						max = tmp > tmp2 ? tmp:tmp2;
						max = tmp3 > max ? tmp3:max;

						//up
						tmp = abs(tpix - image[index - 2 * n]);
						max = tmp>max? tmp:max;
						//down
						tmp = abs(tpix - image[index]);
						max = tmp>max? tmp:max;
						if(number == -1) number = max;
						if(number == max){count ++;}
						else{cout<<number<<" "<<count<<endl; number = max; count = 1;}

						//rearrange image
						for(j = 0; j < 2*n; j++)
						{
							image[j] = image[j+n];
						}
						index = 2*n-1;
					}
				}
				
				index ++;
			}//for i < c
		}//while

		//the last line
		max = 0;
		if(index == n){
			number = abs(image[0] - image[1]);
			count = 1;
			for(j = 1; j < (n - 1); j++)
			{
				tmp = abs(image[j-1]-image[j]);
				tmp2 = abs(image[j+1]-image[j]);
				max = tmp > tmp2? tmp:tmp2;
				if(number == max){count ++;}
				else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
			}
			max = abs(image[n-1] - image[n-2]);
			if(number == max){count ++;}
			else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
			
			cout<<number<<" "<<count<<endl; 
		}else{
			for(j = n;j < 2*n;j++)
			{
				//left
				if(j > n){
					tmp = abs(image[j-1]-image[j]);
					tmp2 = abs(image[j-1-n]-image[j]);
					max = tmp > tmp2 ? tmp:tmp2;
				}
				//right
				if(j < 2*n-1)
				{
					tmp = abs(image[j]-image[j+1]);
					tmp2 = abs(image[j]-image[j+1-n]);
					max = tmp>max? tmp:max;
					max = tmp2>max? tmp2:max;
				}
				//up
				tmp = abs(image[j] - image[j-n]);
				max = tmp>max? tmp:max;

				if(number == -1) number = max;
				if(number == max){count ++;}
				else{cout<<number<<" "<<count<<endl; number = max; count = 1;}
				
			}
			cout<<number<<" "<<count<<endl;
		}
		cout<<0<<" "<<0<<endl;
	
		free(image);
		//delete[] image;
		//HeapFree(GetProcessHeap(),0, image);
		image = NULL;
	}//while
	cout<<0<<endl;


// end of function code
#ifdef DEBUG
	stopWatch->Stop();
	Int64 ticksThisTime = stopWatch->ElapsedMilliseconds;
	cout<<"time:"<<ticksThisTime<<endl;
	
	
#endif
	//system("PAUSE");
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值