考试

34 篇文章 0 订阅
27 篇文章 0 订阅

考试
【问题描述】
今天是星期天。
小L是ASDFZ的学生。新学期,小L整理了一下时间安排表。发现下学期要考n次试。小L每场考试都能一次性通过,另外也可以一天考好几场试。
根据这张统一的时间安排表,一个学生可以在第Ai天参加第i门课的考试。然而,小L和老师商量,可以将第i门课的考试提前至第Bi天进行(Bi<Ai)。所以,小L可以在第Ai天或Bi天进行第i门课的考试。但是老师记录成绩的时候是按第Ai天算。
比方说有一门课应该第3天考,但小L第2天就考了,老师记录的时候,就在小L记录本的最后加一行,小L第3天的考试成绩是xx。可以看出,老师记录的时候是小L实际参加考试的那一天,但写下来的时间是Ai。
小L觉得如果记录下来的考试时间的顺序不是递增(这里递增表示后一个数≥前一个数),那么会显得很奇怪。现在小L请你帮忙,找到最短的完成所有考试的方案,并求出最短要几天。
【输入格式】
第一行一个正整数n
接下来n行每行两个用一个空格隔开的正整数Ai和Bi
【输出格式】
输出一个正整数,表示满足题意的最小天数
【样例1】
exam.in exam.out
3
5 2
3 1
4 2 2
【样例解释】
小L实际第1天参加第2场考试,老师记录为第3天
第2天先参加第3场考试,老师记录为第4天
第2天再参加第1场考试,老师记录为第5天
3,4,5满足题目递增的要求
【样例2】
exam.in exam.out
3
6 1
5 2
4 3 6
【数据范围】
50%的数据:1≤n≤10,1≤Bi<Ai≤100。
100%的数据:1≤n≤5000,1≤Bi<Ai≤10^9。

1:

#include<bits/stdc++.h>
using namespace std;
int n,a[1000],b[1000],c,d,e;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i]>>b[i],c=max(c,a[i]),e=max(e,b[i]);
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
		{
			if(b[i]>b[j]||b[i]==b[j]&&a[i]>a[j])
				swap(b[i],b[j]),swap(a[i],a[j]);
		}
	for(int i=1;i<=n;i++)
		cout<<endl<<a[i]<<' '<<b[i];
	cout<<endl;
	for(int i=1;i<=n;i++)
		if(a[i+1]>a[i])
			d++;
	if(d==n-1)
		cout<<e;
	else
		cout<<c;
	return 0;
}

2:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int n;

struct Node 
{int A;
 int B;
}x[5050];

void init()
{int i;
 cin>>n;
 for(i=1;i<=n;i++)
   cin>>x[i].A>>x[i].B;
}

bool cmp(Node p,Node q)
{if (p.A!=q.A)
   return p.A < q.A;//先按记录时间从小到大排序 
 else
   return p.B < q.B;//再按提前考试时间从小到大排序 
}

void work()
{int i,ans=0;
 sort(x+1,x+n+1,cmp);
  for(i=1;i<=n;i++)
   cout<<x[i].A<<" ";
   cout<<endl;
  for(i=1;i<=n;i++) 
  cout<<x[i].B<<" ";
  cout<<endl;
  /**/
 for(i=1;i<=n;i++)
   if(x[i].B>=ans)//ans表示上一次考试记录下来的时间 
     ans=x[i].B;
   else
     ans=x[i].A;
 cout<<ans<<endl;
}

int main()
{
 init();
 work();
 return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值