zoukankan      html  css  js  c++  java
  • Poj 1974 The Happy Worm(sort结构体二级排序)

    原题地址

    这个A了一天,也没有搞定,查不出自己代码的不过在哪,题意,思路都知道

    我的代码

    sort结构体的二级排序,记下,备用。。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef struct array
    {
    	int x;
    	int y;
    }arr;
    
    bool cmpx(arr a, arr b) {
        if(a.x == b.x) return a.y < b.y;
        else return a.x < b.x;
    }
    
    bool cmpy(arr a, arr b) {
        if(a.y == b.y) return a.x < b.x;
        else return a.y < b.y;
    }
    
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		arr a[140000] = {0};
    		memset(&a,0,sizeof(arr));
    		int m,n,k;
    		int i,j,sum = 0,bleg = 0;
    		scanf("%d %d %d",&m,&n,&k);
    		for(i=0;i<k;i++)
    		{
    			scanf("%d %d",&a[i].x,&a[i].y);
    		}
    
    		sort(a,a+k,cmpx);
    
    		/*for(i=0;i<k;i++)
    		{
    				printf("%d %d
    ",a[i].x,a[i].y);
    		}
    		printf("
    ");*/
    		for(i=1;i<=n;i++)
    		{
    			bleg = 0;
    			for(j=0;j<k;j++)
    				if(i == a[j].y) { bleg = 1; break;}
    			 if(bleg == 0 && m>1) sum++;
    		}
    		//printf("0// %d
    ",sum);
    		for(i=1;i<=m;i++)
    		{
    			bleg = 0;
    			for(j=0;j<k;j++)
    				if(i == a[j].x) {bleg = 1;break;}
    			 if(bleg == 0 && n>1) sum++;
    		}
    		//printf("1// %d
    ",sum);
    		for(i=0;i<k;i++)
    		{
    			if(i == 0)
    			{
    				if(a[i].y - 1 >= 2) sum++;
    			}
    			if(a[i].x != a[i-1].x && i>0)
    			{
    				if(a[i].y - 1 >= 2) sum++;
    			}
    			if(a[i].x != a[i+1].x)
    			{
    				if(m - a[i].y >= 2) sum++;
    			}
    			else
    			{
    				if(a[i+1].x - a[i].x > 2) sum++;
    			}
    		}
    		//printf("hang %d
    ",sum);
    		sort(a,a+k,cmpy);
    
    		/*for(i=0;i<k;i++)
    		{
    				printf("%d %d
    ",a[i].x,a[i].y);
    		}*/
    
    		for(i=0;i<k;i++)
    		{
    			if(i == 0)
    			{
    				if(a[i].x - 1 >= 2) sum++;
    			}
    			if(a[i].y != a[i-1].y && i>0)
    			{
    				if(a[i].x - 1 >= 2) sum++;
    			}
    			if(a[i].y != a[i+1].y)
    			{
    				if(m - a[i].x >= 2) sum++;
    			}
    			else if(a[i].y == a[i+1].y)
    			{
    				if(a[i+1].x- a[i].x > 2) sum++;
    			}
    			//printf("sum %d = %d
    ",i,sum);
    		}
            printf("%d
    ",sum);
    	}
    	return 0;
    }
    

    别人正确的代码(朋友的)

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    typedef struct name{
    int x;
    int y;
    }name;
    name str[140000];
    int cmp(name a,name b)
    {
    	if(a.x!=b.x)
    		return a.x<b.x;
    	else
    		return a.y<b.y;
    }
    int comp(name a,name b)
    {
    	if(a.y!=b.y)
    		return a.y<b.y;
    	else
    		return a.x<b.x;
    }
    int main()
    {
    	int t,n,m;
    	int sum;
    	int k;
    	int count;
    	int i,j;
    	int flat=0;
    	int flat1=0;
    	scanf("%d",&t);
    	for(i=0;i<t;i++){
    			sum=0;
    			count=1;
    			flat=0;
    			flat1=0;
    	scanf("%d %d %d",&n,&m,&k);
    	for(j=0;j<k;j++){
    		str[j] .x=0;
    		str[j] .y=0;
    		scanf("%d %d",&str[j] .x,&str[j] .y);
    	}sort(str,str+k,cmp);
    	str[k] .x=0;
    	str[k] .y=0;
    	for(j=0;j<k;j++)
    	{
    		if(str[j] .x!=str[j+1].x)
    		{
    			if(count==1)
    				{
    			if((str[j] .y-1)>=2)
    				sum++;
    			if((m-str[j] .y)>=2)
    				sum++;
    				count=1;
    				}
    		else if(count>=2)
    		{
    			if((str[j-count+1].y-1)>=2)
    			sum++;
    			if((m-str[j] .y)>=2)
    			sum++;
    			for(int q=(j-count+1);q<j;q++)
    			{
    				if((str[q+1].y-str[q] .y-1)>=2)
    					sum++;
    			}
    			count=1;
    		}
    		if(m>=2)
    		flat++;
    		else
    			flat=n;
    		}
    		else if(str[j] .x==str[j+1].x)
    		{
    			count++;
    			continue;
    		}
    		}
    		sort(str,str+k,comp);
    	for(j=0;j<k;j++)
    	{
    		if(str[j] .y!=str[j+1].y)
    		{
    			if(count==1)
    				{
    			if((str[j] .x-1)>=2)
    				sum++;
    			if((n-str[j] .x)>=2)
    				sum++;
    				count=1;
    				}
    		else if(count>=2)
    		{
    			if((str[j-count+1].x-1)>=2)
    			sum++;
    			if((n-str[j] .x)>=2)
    			sum++;
    			for(int q=(j-count+1);q<j;q++)
    			{
    				if(((str[q+1].x-str[q] .x)-1)>=2)
    					sum++;
    			}
    			count=1;
    		}
    		if(n>=2)
    		flat1++;
    		else
    			flat1=m;
    		}
    		else if(str[j] .y==str[j+1].y)
    		{
    			count++;
    			continue;
    		}
    	}
    	if(k!=0)
    		printf("%d
    ",(sum+(n-flat)+(m-flat1)));
    		else{
    			if(n>=2&&m>=2)
    				printf("%d
    ",n+m);
    			else if(n>=2&&m<2)
    				printf("%d
    ",m);
    			else if(n<2&&m>=2)
    				printf("%d
    ",n);
    			else
    				printf("0
    ");
    		}
    	}
    	return 0;
    } 
    

    百度的

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    typedef struct name
    {
    	int x;
    	int y;
    } name;
    name str[140000];
    int cmp(name a, name b)
    {
    	if (a.x != b.x)
    	{
    		return a.x < b.x;
    	}
    	else
    	{
    		return a.y < b.y;
    	}
    }
    int comp(name a, name b)
    {
    	if (a.y != b.y)
    	{
    		return a.y < b.y;
    	}
    	else
    	{
    		return a.x < b.x;
    	}
    }
    int main()
    {
    	int t, n, m;
    	int sum;
    	int k;
    	int count;
    	int i, j;
    	int flat = 0;
    	int flat1 = 0;
    	scanf("%d", &t);
    
    	for (i = 0; i < t; i++)
    	{
    		sum = 0;
    		count = 1;
    		flat = 0;
    		flat1 = 0;
    		scanf("%d %d %d", &n, &m, &k);
    
    		for (j = 0; j < k; j++)
    		{
    			scanf("%d %d", &str[j] .x, &str[j] .y);
    		}
    
    		sort(str, str + k, cmp);
    		str[k] .x = 0;
    		str[k] .y = 0;
    
    		for (j = 0; j < k; j++)
    		{
    			if (str[j] .x != str[j + 1].x)
    			{
    				if (count == 1)
    				{
    					if ((str[j] .y - 1) >= 2)
    					{
    						sum++;
    					}
    
    					if ((m - str[j] .y) >= 2)
    					{
    						sum++;
    					}
    
    					count = 1;
    				}
    				else
    					if (count >= 2)
    					{
    						if ((str[j - count + 1].y - 1) >= 2)
    						{
    							sum++;
    						}
    
    						if ((m - str[j] .y) >= 2)
    						{
    							sum++;
    						}
    
    						for (int q = (j - count + 1); q < j; q++)
    						{
    							if ((str[q + 1].y - str[q] .y - 1) >= 2)
    							{
    								sum++;
    							}
    						}
    
    						count = 1;
    					}
    
    				if (m >= 2)
    				{
    					flat++;
    				}
    				else
    				{
    					flat = n;
    				}
    			}
    			else
    				if (str[j] .x == str[j + 1].x)
    				{
    					count++;
    					continue;
    				}
    		}
    
    		sort(str, str + k, comp);
    
    		for (j = 0; j < k; j++)
    		{
    			if (str[j] .y != str[j + 1].y)
    			{
    				if (count == 1)
    				{
    					if ((str[j] .x - 1) >= 2)
    					{
    						sum++;
    					}
    
    					if ((n - str[j] .x) >= 2)
    					{
    						sum++;
    					}
    
    					count = 1;
    				}
    				else
    					if (count >= 2)
    					{
    						if ((str[j - count + 1].x - 1) >= 2)
    						{
    							sum++;
    						}
    
    						if ((n - str[j] .x) >= 2)
    						{
    							sum++;
    						}
    
    						for (int q = (j - count + 1); q < j; q++)
    						{
    							if (((str[q + 1].x - str[q] .x) - 1) >= 2)
    							{
    								sum++;
    							}
    						}
    
    						count = 1;
    					}
    
    				if (n >= 2)
    				{
    					flat1++;
    				}
    				else
    				{
    					flat1 = m;
    				}
    			}
    			else
    				if (str[j] .y == str[j + 1].y)
    				{
    					count++;
    					continue;
    				}
    		}
    
    		if (k != 0)
    		{
    			printf("%d
    ", (sum + (n - flat) + (m - flat1)));
    		}
    		else
    		{
    			if (n >= 2 && m >= 2)
    			{
    				printf("%d
    ", n + m);
    			}
    			else
    				if (n >= 2 && m < 2)
    				{
    					printf("%d
    ", m);
    				}
    				else
    					if (n < 2 && m >= 2)
    					{
    						printf("%d
    ", n);
    					}
    					else
    					{
    						printf("0
    ");
    					}
    		}
    	}
    
    	return 0;
    }
    



    www.cnblogs.com/tenlee
  • 相关阅读:
    BootStrap Table前台和后台分页对JSON格式的要求
    神奇的外部嵌套(使用ROW_NUMBER()查询带条件的时候提示列名无效)
    要想获取select的值,使用ng-modle,否则无法获取select 的值
    Angular使用操作事件指令ng-click传多个参数示例
    Jenins 邮件通知
    Jenkins 流水线(Pipeline)
    Jenkins Master-Slave 架构
    Jenins 参数化构建
    Jenkins 用户权限管理
    Jenkins 安装
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420160.html
Copyright © 2011-2022 走看看