第三题 冶炼金属
#include <bits/stdc++.h>
using namespace std;
//int A[1e9],B[1e9]
vector<int> A,B;
int L=0;
bool check_min(int V)
{
for(int i=0;i<L;i++)
{
if(A[i]/V>B[i]) return false;
}
return true;
}
bool check_max(int V)
{
for(int i=0;i<L;i++)
{
if(A[i]/V<B[i]) return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> L;
for(int i=0;i<L;i++)
{
int tmp1,tmp2;
cin>>tmp1>>tmp2;
A.push_back(tmp1);
B.push_back(tmp2);
}
// 请在此输入您的代码
int l=0,r=1e9+1;
int v_min=0,v_max=0;
while(l<=r)//寻找左边界
{
//cout << "1";
int mid=l+r>>1;
if(check_min(mid) == true)
{
//cout <<mid<<endl;
v_min = mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
l=0,r=1e9+1;//注意为什么不是1e4而是1e9 写的时候一定要清醒
while(l<=r)//寻找右边界//等于号不能丢啊
{
//cout << "2";
int mid=l+r>>1;
if(check_max(mid) == true)
{
//cout <<mid<< endl;
v_max = mid;
l=mid+1;
}
else
{
//cout << mid;
r=mid-1;
}
}
cout << v_min <<" " << v_max;
return 0;
}
第四题 飞机降落
#include<bits/stdc++.h>
using namespace std;
int N=0;
vector<int> T,D,L;
char bool_vector[20] = {0};
int have_anser = 0;
void slove(int n,int n_max,int tim,vector<int>& pl)//当前飞机的降落的个数,和当前的时间
{
///cout << n;
if(n == n_max)
{
//cout << "YES" << endl;
have_anser = 1;
return;
}
for(int i=0;i<n_max;i++)
{
if(pl[i]==0&&tim <= (T[i]+D[i]) ) //这里的等于情况是可以的,不然测试用例部分过不去
{
//cout << i <<endl;
if(have_anser == 1) return;
pl[i] = 1;
slove(n+1,n_max,max(tim,T[i])+L[i],pl);
pl[i] = 0;
}
}
return;
}
int main()
{
// 请在此输入您的代码
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for(int i=0;i<N;i++)
{
int M=0;
cin >>M;
for(int j=0;j<M;j++)
{
int t,d,l;
cin >> t >> d >>l;
T.push_back(t);
D.push_back(d);
L.push_back(l);
}
vector<int> pl;
pl.resize(M,0);
slove(0,M,0,pl);//处理当前这组数据
if(have_anser == 0) cout << "NO" <<endl;
if(have_anser == 1) cout << "YES" <<endl;
have_anser = 0;
//清楚当前的容器
T.clear();
D.clear();
L.clear();
}
// //cout << "YES" << endl << "NO" << endl;
// for(int i=0;i<N;i++)
// {
// if(bool_vector[i]==1)
// cout << "YES" << endl;
// else
// cout << "NO" << endl;
// }
return 0;
}