`

南阳理工OJ 236 心急的C小加 两个条件限制贪心

 
阅读更多

  连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=236

 

心急的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

 

/*
用贪心的方法写的,先对数据进行双重排序,把第i个数据放入动态数组
的过程是:先和前面放在动态数组的数比较,如果没有一个小于这个数
,就放在动态数组的后面,表示需要加一个单位时间来做这根木棒,
如果有比这个数小的,就找出他们长度就接近的,也就是相差最小的数,
用这第i个数覆盖它,以此类推。。。最后动态数组的长度就是最少所需要的时间
*/
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
       int x;
       int y;
}p[1005];
bool operator < (const node a,const node b)//双重排序
{
       if(a.x == b.x)return a.y < b.y ;
       return a.x < b.x;
}
vector<int> time;
vector<int>::iterator it,maskit;
int main()
{
       int T,i,n,f,min;
       scanf("%d",&T);
       while(T--)
       {
              scanf("%d",&n);
              for(i=0;i<n;i++)
                     scanf("%d%d",&p[i].x,&p[i].y);
              sort(p,p+n);
              for(i=0;i<n;i++)
              {
                     f=0;min=1<<30;
                     for(it=time.begin();it!=time.end();it++)//和动态数组前面的数比较
                            if(p[i].y>=*it&&p[i].y-*it<=min)
                                   {min=p[i].y-*it;maskit=it;f=1;}
                     if(f==0)time.push_back(p[i].y);//如果没有比它小的就放在后面
                     else *maskit+=min;  //找到了就把就接近它的数更新一下
                    /* for(it=time.begin();it!=time.end();it++)printf("%d  ",*it);
                     printf("\n");*/
              }
              printf("%d\n",time.size());
              time.clear();
       }
       return 0;
}

 

 刚才的代码  很直观,但效率不太高,

下面来个效率高的(做题思想是一样的)

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct mb
{
	int len;//**长**//
	int weight;//**重量**//
}w[10001];
bool comp(mb x,mb y)//**按照长度排序,如果长度相同则按重量排序**//
{
	if(x.len<y.len) return true;
	if(x.len==y.len&&x.weight<y.weight) return true;
	return false;
}
int main()
{
	int s,n,i,j,count,t;
	scanf("%d",&s);
	while(s--)
	{
		memset(w,0,sizeof(w));//**首先需要将数组清零**//
		count=0;
		scanf("%d",&n);
		for(i=0;i<=n-1;i++)
		{
			scanf("%d %d",&w[i].len,&w[i].weight);
		}
		sort(w,w+n,comp);
		for(i=0;i<=n-1;i++)//**此时长度、重量已经从小到大排好了**//
		{
			if(w[i].weight!=0)//**如果这个数没有出现过,后面代码有标记**//
			{
				t=w[i].weight;
				count++;
				for(j=i+1;j<=n-1;j++)
				{
					if(w[j].weight>=t)
					{
						t=w[j].weight;//**用一个数保存最新清零的重量,在j循环中保证了一次能够处理的木棒最多**//
						w[j].weight=0;//**将排好序的标记为0,清除**//
					}
				}
			}
		}
		printf("%d\n",count);
	}
	return 0;
}  

 

 

 

1
8
分享到:
评论

相关推荐

    南阳理工oj离线题库

    南阳理工oj就是这样一个平台,专为南阳理工学院的学生和编程爱好者设计,提供了丰富的编程题目供他们挑战和提升自己的能力。 离线题库的组成部分可能包括以下几点: 1. 题目描述:每个题目都有详细的描述,包括...

    南阳理工学院OJ_个人AC代码包(Java提交)

    【南阳理工学院OJ_个人AC代码包(Java提交)】是针对Java初学者的一份宝贵资源,它包含了参与ACM国际大学生程序设计竞赛(ICPC)时在南阳理工学院在线评测系统(OJ)上获得正确答案的代码实例。这些代码展示了如何用...

    南阳理工学院OJ第1版解题报告V1.0.pdf

    ### 南阳理工学院OJ第1版解题报告概览 #### 1. A+B Problem 虽然解题思路在报告中被省略,但我们可以推测这是一个基础的数学加法问题,涉及到数字输入与基本算术操作。此类题目旨在测试初学者对编程语言基本输入...

    南阳理工oj stl练习ac代码

    例如,less和greater用于比较,plus用于加法,bind1st和bind2nd用于固定一个或两个参数。 5. ACM竞赛: ACM(International Collegiate Programming Contest)是全球知名的大学生程序设计竞赛,其中STL的熟练运用...

    湖南理工oj题解(学习用)-共230道题

    【标题】:“湖南理工oj题解(学习用)-共230道题”揭示了这是一个针对湖南理工大学在线编程竞赛平台(Online Judge,简称OJ)的题解集合,包含了230个不同题目。这类资源通常由参赛者或者经验丰富的程序员整理,...

    郑州轻工业oj;C语言200道题压缩包

    郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;...

    oj刷题 西安理工大学学生在线实验系统编程题答案(超级详细)

    这个“oj刷题”压缩包文件很可能是包含了西安理工大学在线实验系统中的一些典型题目,包括但不限于排序算法(如冒泡排序、快速排序、归并排序)、搜索算法(如二分查找、深度优先搜索、广度优先搜索)、图论问题(如...

    哈理工oj 1084百步穿杨

    哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案

    湖南理工学院OJ-小鱼比可爱

    湖南理工学院小鱼比可爱OJ题

    OJ部分习题及解答(c语言)

    4. **833-取石子(七).c**:这可能是一个典型的博弈论问题,可能涉及到动态规划或者最小最大策略,要求程序模拟两个玩家取石子的游戏。 5. **198-数数.c**:可能涉及数字处理,例如计数、排序或者序列生成,要求...

    oj源码与c语言练习

    根据给定的信息,我们可以分析出该段代码涉及的C语言知识点包括数组操作、字符串处理、条件判断、循环结构以及简单的算法实现。下面将对这些知识点进行详细的解释。 ### 数组操作 1. **数组声明与初始化**:在...

    山东理工大学2016级OJ题1832

    7. **数学公式应用**:一元二次方程的解法使用了求根公式,即 `(-b ± sqrt(b² - 4ac)) / 2a`,并定义了两个辅助函数 `M1` 和 `M2` 来分别计算两个根。 8. **三角形面积计算**:在求三角形面积的程序中,利用海伦...

    基于Laravel 5.0的OJ题解网站 , 目前涵盖安科OJ,南阳OJ,杭电OJ ,北大OJ,浙大OJ.zip

    【描述】中提到的“目前涵盖安科OJ,南阳OJ,杭电OJ,北大OJ,浙大OJ”意味着这个题解网站已经集成了多个知名OJ平台的题目,用户可以在一个统一的平台上找到这些不同OJ的题目并查看解决方案。安科OJ、南阳OJ、杭电OJ...

    C语言回文数OJ题和答案

    另一种方法是使用两个指针,一个从左向右,一个从右向左,比较对应位置的数字是否相等,直到两个指针相遇或者发现不匹配的位置。 接下来,我们需要找到所有小于65536的完全平方数。可以使用一个循环,从1开始,每次...

    Home Work OJ题目

    在这些问题中,贪心策略可以是每次选取最优硬币面值、分配任务给最早可完成的工人、选取连接两个节点代价最小的边等。 在实现过程中,我们需要编写C语言的主函数,可能涉及到结构体、数组、循环和条件判断等语法。...

    华为OJ题目集合

    【华为OJ C C++ OJ测试平台】标签表明了这个合集主要关注C和C++这两种编程语言。C语言是底层编程的基础,注重效率和内存管理,适合学习计算机系统原理和理解数据结构与算法;而C++作为C语言的扩展,增加了类、模板、...

    趣味题:柱状图排序 西安理工大学学生在线实验系统 oj

    趣味题:柱状图排序 西安理工大学学生在线实验系统 oj

    C++实现oj算法代码-贪心算法.zip

    贪心算法是计算机科学中解决问题的一种策略,它在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的。在C++编程中,贪心算法常常被用来解决一些复杂的问题,例如任务调度、最小...

    100多道关于C语言的练习答案,原题可以在OJ上找到

    这个压缩包包含的是100多道C语言的练习题目答案,这些题目来源于在线判断平台(Online Judge,简称OJ)。OJ是编程学习者检验代码正确性的理想工具,它能够自动运行用户提交的代码,并根据预期的输入和输出来判断代码...

    hdoj.rar_HDOJ _OJ_oj_如何卡oj

    【标题】"hdoj.rar_HDOJ _OJ_oj_如何卡oj" 提供的信息主要涉及到两个关键概念:HDOJ(杭州电子科技大学在线评测系统)和OJ(Online Judge),以及“如何卡oj”的技巧。首先,让我们详细了解这两个核心概念。 OJ(On...

Global site tag (gtag.js) - Google Analytics