1244A Pens and Pencils
题意:给定a,b,c,d,k。有两种物品,一个物品1的价值是c,物品2的价值是d。背包容量至多可以装k个物品。问有没有装物品的方案使得物品1的价值至少位a,物品2的价值至少位b。有输出合法的一种,没有输出-1.
题解:直接求
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
int a,b,c,d,k;
cin>>t;
while(t--){
cin >> a >> b >> c >> d >> k;
int pen = a / c + (a % c != 0);
int pencil = b / d + (b % d != 0);
if(pen + pencil > k){
puts("-1");
}else{
cout<<pen<<" "<<pencil<<endl;
}
}
return 0;
}
1244B Rooms and Staircases
题意:Nikolay 有个两层楼的房子,每层n个房间。每个房间和左右相邻房间有个门可以互通。一层和二层有一些梯子。有梯子的不同层房间可以互通。如下图。问Nikolay从任一房间开始,每次可以走到互通的房间中去,能到达的最大房间数。期间不能进入一个房子两次。
题解:贪心。如果没有梯子,显然数目就是n。如果有一个梯子,那么就是拐一个弯,如下图。
如果有大于等于两个梯子。不难看出中间的可以不予考虑,最大的依然是考虑边缘的两个梯子,从一端开始,拐最长的弯。
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t, n;
string s, s1;
cin >> t;
while(t--){
cin >> n >> s;
s1 = s;
reverse(s1.begin(), s1.end());
string::size_type pos1 = s.find('1');
string::size_type pos2 = s1.find('1');
if(pos1 == s.npos) cout << n << endl;
else cout<< 2 * n - 2 * min(pos1, pos2) << endl;
}
return 0;
}
1244C The Football Season
题意:给定n,p,w,d
求解满足下式的非负整数x,y,z
题解:
相当于求
x ⋅ w + y ⋅ d = p x + y ≤ n x \cdot w + y \cdot d = p\\x+y \le n x⋅w+y⋅d=px+y≤n
如果有一组 x , y x,y x,y满足 x ⋅ w + y ⋅ d = p x \cdot w + y \cdot d = p x⋅w+y⋅d=p,
则 x ⋅ w + y ⋅ d = x ⋅ w + ( ⌊ y / w ⌋ ⋅ w + y % w ) ⋅ d = ( x + ⌊ y / w ⌋ ⋅ d ) ∗ w + ( y % w ) d = p x\cdot w+y\cdot d = x\cdot w+(\lfloor y/w \rfloor \cdot w + y \%w)\cdot d =(x+ \lfloor y/w \rfloor \cdot d) * w + (y\%w) d =p x⋅w+y⋅d=x⋅w+(⌊y/w⌋⋅w+y%w)⋅d=(x+⌊y/w⌋⋅d)∗w+(y%w)d=p
且 x + ⌊ y / w ⌋ ⋅ d + y % w ≤ x + ⌊ y / w ⌋ ⋅ w + y % w = x + y x + \lfloor y/w \rfloor \cdot d + y \% w \le x+ \lfloor y/w \rfloor \cdot w + y \%w=x+y x+⌊y/w⌋⋅d+y%w≤