1 条题解

  • 0
    @ 2025-4-7 21:19:29

    C :

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #define N 1010
    struct Node
    {
        double l;
        double w;
    
    }node[N];
    
    int cmp(const void *a,const void *b)
    {
        if((*(struct Node *)a).l!=(*(struct Node *)b).l)
          return (*(struct Node *)a).l > (*(struct Node *)b).l ?1:-1;
        else
          return (*(struct Node *)a).w > (*(struct Node *)b).w ?1:-1;
    }
    int main()
    {
        int ncase;
        scanf("%d",&ncase);
        while(ncase--)
        {
    		int n,i,j;
    		double t;
            int count=1;
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%lf%lf",&node[i].w,&node[i].l);
    			if(node[i].w>node[i].l)
    			{
    				t=node[i].w;
    				node[i].w=node[i].l;
    				node[i].l=t;
    			}
    		}       
            qsort(node,n,sizeof(node[0]),cmp);
            for(i=0;i<n-1;)
    		{
    			for(j=i+1;j<n;)
    			{
    				if(node[i].l<node[j].l && node[i].w<node[j].w)
    				{
    					count++;
    					i=j;
    					break;
    				}
    				else
    					j++;
    			}
    			if(j==n)
    				break;
    		}
    		printf("%d\n",count);
        }
        return 0;
    }
    
    
    

    C++ :

    
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define M 1024
    using namespace std;
    struct rect{
        int len,width;
    }d[M],p[M];
    bool cmp(rect a,rect b)//按长排降序,后再按宽排
    {
        if(a.len==b.len) return a.width<b.width;
        return a.len>b.len;
    }
    int main(){
        int m;
        scanf("%d",&m);
        while(m--)
        {
            int n,i,j,t;
            scanf("%d",&n);
            for(i=0;i<n;i++){
                scanf("%d %d",&d[i].len,&d[i].width);
                if(d[i].width>d[i].len)
                    {
                        t=d[i].width;
                        d[i].width=d[i].len;
                        d[i].len=t;
                    }
               }
            sort(d,d+n,cmp);
            int length=1;
            p[0].len=900,p[0].width=900;
            for(i=0;i<n;i++)//终止位置
            {
                for(j=length-1;j>=0;j--)//length 长度
                 {
                     if(d[i].width<p[j].width&&d[i].len<p[j].len) { p[j+1]=d[i];  if(j+1==length) length++; break;}
    
                 }
            }
            printf("%d\n",length-1);
            }
    }
    
    

    Java :

    import java.util.Scanner;
    
    
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		int t = in.nextInt();
    		while (t-- > 0) {
    			int n = in.nextInt();
    			Graph[] map = new Graph[100];
    			int[] f = new int[n + 1];
    			boolean[][] g = new boolean[100][100];
    			for (int i = 1; i <= n; i++) {
    				map[i] = new Graph();
    				map[i].x = in.nextInt();
    				map[i].y = in.nextInt();
    			}
    			for (int i = 1; i <= n; i++) {
    				for (int j = 1; j <= n; j++) {
    					if (map[i].x < map[j].x && map[i].y < map[j].y
    							|| map[i].x < map[j].y && map[i].y < map[j].x)
    						g[i][j] = true;
    				}
    			}
    			for (int i = 1; i <= n; i++) {
    				f[i] = dp(f, i, n, g);
    			}
    			int max = 0;
    			for (int i = 1; i <= n; i++) {
    				if (max < f[i]) {
    					max = f[i];
    				}
    			}
    			System.out.println(max);
    		}
    	}
    
    	public static int dp(int[] f, int i, int n, boolean[][] g) {
    		if (f[i] > 0)
    			return f[i];
    		f[i] = 1;
    		for (int j = 1; j <= n; j++) {
    			if (g[i][j])
    				f[i] = Math.max(f[i], dp(f,j,n,g) + 1);
    		}
    		return f[i];
    	}
    }
    class Graph{
    	int x,y;
    }
    
    
    • 1

    信息

    ID
    1196
    时间
    1000ms
    内存
    64MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者