心急的C小加

第一部分:题目

心急的C小加  题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=236

时间限制: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<stdio.h>
int fun(int v[100][2], int left, int right)//快速排序
{
    if(left < right)
    {
        int key = v[left][0];
        int key2= v[left][1];
        int low = left;
        int high = right;
        while(low < high)
        {
            while(low < high && v[high][0] >= key)
            {
                if(v[high][0]==key&&v[high][1]<key2)//在长度相同的情况下再对重量进行排序
                {
                    int t=v[high][1];
                    v[high][1]=key2;
                    key2=t;
                    v[low][1]=t;
                }
                high--;
            }
            v[low][0]= v[high][0];
            v[low][1]= v[high][1];
            while(low < high && v[low][0]<= key)
            {

                if(v[low][0]==key&&v[low][1]>key2)
                {
                    int t=v[low][1];
                    v[low][1]=key2;
                    key2=t;
                    v[high][1]= key2;
                }
                low++;
            }
            v[high][0]= v[low][0];
            v[high][1]= v[low][1];
        }
        v[low][0]= key;
        v[low][1]= key2;
    //注意:递归条件
        if(low-1>left)
        {
            fun(v,left,low-1);
        }
        if(low+1<right)
        {
            fun(v,low+1,right);
        }
    }
}
int main()
{
    int n,m,i,len;
    int s[5001][2];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&len);
        for(i=1;i<=len;i++)
        {
            scanf("%d %d",&s[i][1],&s[i][0]);//存储木棒的长和重量
        }
        fun(s,1,len);
        int count=0;//记录排序后的重量的增序列个数
        for(i=1;i<=len;i++)
        {
            if(s[i][1]==0)//如果一个数在一个增序列中用过了就置为0
            {
                continue;
            }
            int j;
            count++;
            int temp=s[i][1];
            s[i][1]=0;
            for(j=i+1;j<=len;j++)
            {
                if(s[j][1]>=temp)
                {
                    temp=s[j][1];
                    s[j][1]=0;
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}

时间: 2024-11-09 23:58:53

心急的C小加的相关文章

心急的C小加(南阳oj236)(贪心)

心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组. 每组测试数据的第一行是一个整数N(1&l

心急的C小加(两种解法)

心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大 于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做 吗? 输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组. 每组测试数据的第一行是一个整数N(1

nyoj 236心急的C小加(贪心)

心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组. 每组测试数据的第一行是一个整数N(1&l

问题 G: 心急的C小加

题目描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组. 每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒.接下来的一行分别输入N个木棒的L,W

nyoj-236-心急的C小加

http://acm.nyist.net/JudgeOnline/problem.php?pid=236 心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第

南阳236--心急的C小加

心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组.每组测试数据的第一行是一个整数N(1<

NYOJ-C小加 之 随机数

C小加 之 随机数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 ACM队的"C小加"同学想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(0<N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助 C小加 完成"去重"与"排序"的工作. 输入

C小加 之 随机数

描述 ACM 队的“C小加”同学想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数 (0<N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排 好的顺序去找同学做调查.请你协助 C小加 完成“去重”与“排序”的工作. 输入 第一行输入整数T(1<T<10)表示多少组测试数据, 每组测试数据包括2行, 第1行为1个正整数,表示所生成的随机数的个数:N(0&

郁闷的C小加(一)

郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand.ACM队的"C小加"正在郁闷怎样把一个中缀表达式转换为后缀表达式,现在请你设计一个程序,帮助C小加把中缀表达式转换成后缀表达式.为简化问题,操作数均为个