连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=236
心急的C小加
时间限制:1000 ms | 内存限制:65535 KB
难度:4
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?
每组测试数据的第一行是一个整数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; }
相关推荐
南阳理工oj离线题库
南阳理工学院OJ第1版解题报告V1.0.pdf
南阳理工学院OJ_个人AC代码包(Java提交) 是Java初学者登堂入室的很好例子。
南阳理工学院stl练习场全部ac代码!
南阳理工ACM离线题库
哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案
西安理工大学学生在线实验系统编程题答案(超级详细)
郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;...
oj题目源码,你可以轻松AC题目,
山东理工大学2016级OJ进程,始于悦行,终于诚信。
基于Laravel 5.0的OJ题解网站 , 目前涵盖安科OJ,南阳OJ,杭电OJ ,北大OJ,浙大OJ.zip
趣味题:柱状图排序 西安理工大学学生在线实验系统 oj
编程序可以跟着自己的思路编写,但是阅读别人的程序需要先理顺程序的思路。代码的排版以及注释将直接影响修改以及测试程序的效率。
100多道关于C语言的练习答案,原题可以在OJ上找到,都是我自己做,通过OJ系统检验
C++实现oj算法代码---贪心算法
XMU OJ 1230的解题报告和源代码 菜鸟小李是xmu大x的学生了,可英语总数6x。四级考试临近了,临时抱佛脚的他买了本英语词汇,可是小李是个大穷人,随便街摊买了本盗版的新东方。回到宿舍才发现:书里的单词竟然是...
山东理工大学2016级OJ题目1834
C语言OJ试题[参照].pdf
西南科技大学oj上的c语言实验课的全部ac代码
OJ系统的蓝桥杯题库,http://oj.xpuca.top/,这里有这些题的栗子。