pku 1009

Source Code

Problem: 1009 User: cug_fish2008
Memory: 288K Time: 16MS
Language: C++ Result: Accepted
  • Source Code
    #include <iostream>
    #include <list>
    #include <vector>
    #include <math.h>
    using namespace std;
    
    int width;
    int current,cnum,n;
    struct Image{int pixel,num;};
    struct wp{int end,pixel;};
    Image ig[1009];
    int u;
    list<vector<wp>> ls;
    vector<wp> row,row1,row2,row3;
    void pushrow();
    void cmprow();
    int main()
    {
    	scanf("%d",&width);
    	while(width!=0){
    		n=-1;
    		int pixel,num;
    		scanf("%d%d",&pixel,&num);
    		while(pixel!=0 || num!=0){
    			ig[++n].pixel=pixel;
    			ig[n].num=num;
    			scanf("%d%d",&pixel,&num);
    		}
    		cout<<width<<endl;
    		current=-1;u=0;
    		ls.clear();row.clear();
    		row1.clear();row2.clear();row3.clear();
    		bool bg=true;
    		while(bg){
    			if(ig[u].num/width<3){
    				if(ls.empty()){
    					pushrow();
    					ls.push_back(row);
    					ls.push_back(row);
    					row.clear();
    				}
    				if(ig[n].num<=0){
    					list<vector<wp>>::iterator i=
                                                                       ls.begin();
    					i++;
    					ls.push_back(*i);
    					bg=false;
    				}
    				else {
    					pushrow();
    					ls.push_back(row);
    					row.clear();
    				}
    				list<vector<wp>>::iterator i=ls.begin();
    				row1=*i;i++;
    				row2=*i;i++;
    				row3=*i;
    				cmprow();
    				ls.pop_front();
    			}
    			else {
    				if(ls.empty()){
    					if(current+1==0){current=0;cnum=0;}
    					cnum+=(ig[u].num/width-1)*width;
    					ig[u].num=width+ig[u].num%width;
    				}
    				else {
    					pushrow();
    					list<vector<wp>>::iterator i=
                                                                       ls.begin();
    					row1=*i;i++;
    					row2=*i;
    					row3=row;
    					row.clear();
    					ls.clear();
    					cmprow();
    					if(current!=0){
    						cout<<current<<" "
    							<<cnum<<endl;
    						current=0;cnum=0;
    					}
    					cnum+=(ig[u].num/width)*width;
    					ig[u].num=width+ig[u].num%width;
    				}
    			}
    		}
    		cout<<current<<" "<<cnum<<endl;
    		cout<<"0 0"<<endl;
    		scanf("%d",&width);
    	}
    	cout<<"0";
    	return 0;
    }
    void pushrow()
    {
    	int i=0;
    	wp p;
    	while(1){
    		if(ig[u].num<=0)u++;
    		if(ig[u].num>=width-i){
    			p.end=width;
    			p.pixel=ig[u].pixel;
    			ig[u].num-=(width-i);
    			row.push_back(p);
    			break;
    		}
    		p.end=i+ig[u].num;
    		p.pixel=ig[u].pixel;
    		i=p.end;
    		row.push_back(p);
    		ig[u].num=0;
    	}
    }
    int fb(int x,int y){return int(fabs(float(x-y)));}
    void output(int sub)
    {
    	if(sub!=current){
    		if(current+1!=0)
    			cout<<current<<" "<<cnum<<endl;
    		current=sub;cnum=0;
    	}
    }
    void cmprow()
    {
    	vector<wp>::iterator wp1=row1.begin();
    	vector<wp>::iterator wp2=row2.begin();
    	vector<wp>::iterator wp3=row3.begin();
    
    	int a1,a2,a3,b1,b2,b3;
    	int currentsub,c,ssub,fsub,s,f;
    	s=1;a1=(*wp1).pixel;a2=(*wp2).pixel;a3=(*wp3).pixel;
    	while(1){
    		if(s>width)break;
    		c=(*wp2).pixel;
    		currentsub=max(fb(c,(*wp1).pixel),fb(c,(*wp3).pixel));
    		ssub=max(currentsub,max(fb(c,a1),max(fb(c,a2),fb(c,a3))));
    
    		f=width+1;
    		if((*wp1).end<f)f=(*wp1).end;
    		if((*wp2).end<f)f=(*wp2).end;
    		if((*wp3).end<f)f=(*wp3).end;
    		a1=b1=(*wp1).pixel;a2=b2=(*wp2).pixel;a3=b3=(*wp3).pixel;
    		if(f<width){
    			if(f+1>(*wp1).end){wp1++;b1=(*wp1).pixel;}
    			if(f+1>(*wp2).end){wp2++;b2=(*wp2).pixel;}
    			if(f+1>(*wp3).end){wp3++;b3=(*wp3).pixel;}
    		}
    		fsub=max(currentsub,max(fb(c,b1),max(fb(c,b2),fb(c,b3))));
    
    		if(f==s){
    			output(max(ssub,fsub));
    			cnum++;}
    		else{
    			output(ssub);
    			cnum++;
    			int t=f-s-1;
    			if(t!=0){
    				output(currentsub);
    				cnum+=(f-s-1);}
    			output(fsub);
    			cnum++;
    		}
    		s=f+1;	
    	}
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值