T1 安排活动(activity)
题目描述
学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让—些活动放弃使用礼堂而使用其他教室。
现在给出n个活动使用礼堂的起始时间begin(i)和结束时间end(i)[begin(i)<end(i)],请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。
输入
第行一个整数n(n≤1000);
接下来的n行,每行两个整数,第一个begin(i),第二个是end(i)[begin(i)<end(i)<=32767]
输出
输出最多能安排的活动个数。
代码
#include <bits/stdc++.h>
using namespace std;
struct hd{
int ks,js;
}a[1005];
bool cmp(hd x,hd y){
return x.js<y.js;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].ks>>a[i].js;
}
sort(a+1,a+n+1,cmp);
int end=a[1].js,ans=1;
for(int i=2;i<=n;i++){
if(a[i].ks<end){
continue;
}
else{
ans++;
end=a[i].js;
}
}
cout<<ans;
return 0;
}
T2 过河问题(Crossing the river)
题目描述
有n个人一条船,所有人要从左岸渡船到右岸,第i个人过河时间是ai。船上最多坐两个人,船从右岸回到左岸时必须保证船上有人。每次船的行驶时间等于船上两人中过河时间的较大值。
问过河所需最短时间。
输入
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
输出
输出t行数据,每行1个数,表示每组过河最少时间。
代码
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <set>
using namespace std;
int main(){
int N;
cin >> N;
while(N--){
int n,i;
long long sum = 0;
cin >> n;
int a[n];
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
if(n==1){
cout<<a[0]<<endl;
continue;
}
if(n==2){
cout<<a[1]<<endl;
continue;
}
if(n==3){
sum=a[2]+a[0]+a[1];
cout<<sum<<endl;
continue;
}
int x=2*a[1]-a[0];
for(i=n-2;i>=2;i-=2){
if(a[i]<x) break;
sum=sum+a[i+1]+a[0]+2*a[1];
}
i++;
for(;i>=1;i--){
sum+=a[i]+a[0];
}
sum=sum-a[0];
cout<<sum<<endl;
}
return 0;
}