2016sdau课程练习专题一 1001 problemB

来源:互联网 发布:微信公众号授权域名 编辑:程序博客网 时间:2024/05/19 20:19

1.题目编号 

1001 problemB

2.简单题意

将木棍放在机器里处理,第一根需要一分钟,剩余的如果大于等于前边放入的长度和重量,就不用费时间,否则需要一分钟,计算给出一组数的最少时间.

3.解题思路

使用贪心算法来解本题,首先按照木棍长度和重量由小到大排列,然后比较不同的木棍长度,若后一个长度和重量都大于前一个则总时间不变否则加一分钟.

4.感想

关于贪心算法的一种实例,在定义排序时挺难的,并不好做

5.代码

#include<iostream>
#include<algorithm>
#include<cstring>
#define SIZE 5000
using namespace std;
struct  wood
{
int l;
int w;
int flag;
}wod[SIZE];
bool cmp(wood a,wood b)
{
    if(a.l==b.l) return a.w<b.w;
    else if(a.l<b.l)return true;
    else return false;  
 } 
 
 int main()
 {
  int T,J;
  cin>>T;
  for(J=0;J<T;J++)
{
int n;
cin>>n;
int time,length,weight;
memset(wod,0,sizeof(wod));
int a,b;
for(a=0;a<n;a++)
{
cin>>wod[a].l >>wod[a].w ;

sort(&wod[0],&wod[n],cmp);
wod[0].flag=1;
length=wod[0].l ;
weight=wod[0].w ;
time=1;
for(a=1;a<n;a++)
{
for(b=a;b<n;b++)
             {
                  if(!wod[b].flag&&wod[b].l>=length&&wod[b].w>=weight)
                 {
                        length=wod[b].l;
                        weight=wod[b].w;
                        wod[b].flag = 1;
        }
        }
         for(b=1;b<n;b++)
             {
                  if(!wod[b].flag)  break;
             }
             a=b;
             if(a==n)   break;
             length=wod[a].l;
             weight=wod[a].w;
             wod[a].flag= 1;
             time++;
            }
           cout<<time<<endl;
      }
         }

0 0