NYOJ-心急的C小加

    xiaoxiao2021-03-25  112

    心急的C小加

    时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 4 描述

    C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

    输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组。 每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。 输出 处理这些木棒的最短时间。 样例输入 3 5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1 样例输出 2 1 3

    解题思路

    此题刚开始没有仔细推敲,以为只是一个简单的最长递增子序列,后来发现不仅仅是这样。

    解题代码

    #include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; struct node {     int length;     int weight; }ch[5005]; bool cmp(node a,node b) {     if(a.length==b.length)         return a.weight<b.weight;     else         return a.length<b.length; } int main() {     int T;     scanf("%d",&T);     int vis[5005];     while(T--)     {         int n;         scanf("%d",&n);         for(int i=1;i<=n;i++)             scanf("%d%d",&ch[i].length,&ch[i].weight);         sort(ch+1,ch+1+n,cmp);         int sum=0;         memset(vis,0,sizeof(vis));         for(int j=1;j<=n;j++)         {             if(vis[j]==0)             {                 vis[j]=1;                 sum++;                 int l=ch[j].length;                 int w=ch[j].weight;                for(int i=j+1;i<=n;i++)                 {                     if(vis[i]==0&&l<=ch[i].length&&w<=ch[i].weight)                         {                             vis[i]=1;                             l=ch[i].length;                             w=ch[i].weight;                         }                 }             }         }         printf("%d\n",sum);     }     return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-18991.html

    最新回复(0)