A.Setting up Camp
只需满足让b的人住满就可以了。
其余的则按照最小标准来算
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
void solve()
{
int a,b,c;
cin>>a>>b>>c;
if( b%3 && c+(b%3)<3){
cout<<-1<<endl;
return ;
}
else {
int ans=0;
ans+=a;
ans+=(b/3);
if(b%3){
ans++;
c-=(3-(b%3));
}
ans+=(c/3);
if(c%3){
ans++;
}
cout<<ans<<endl;
}
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
B - Fireworks
先分别求出两种各自再(m+1)的时间里最大可拥有的数量,因为两种的释放时间存在最小公倍数,即可同时开始放,所以可同时满足各自的最大数量
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
void solve()
{
int a,b,m;
cin>>a>>b>>m;
m++;
int maxn1=m/a;
if(m%a){
maxn1++;
}
int maxn2=m/b;
if(m%b){
maxn2++;
}
int tmp=abs(a-b);
int tmp1=m%a;
int tmp2=m%b;
int tmp3=max(tmp1,tmp2);
if(tmp==0){
cout<<maxn1+maxn2<<endl;
return ;
}
cout<<maxn1+maxn2<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
C - Left and Right Houses
这题模拟即可,使用一个前缀和来计算前后的1的数量,再维护一下 |n/2-i| 最小即可
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
int sum[300010];
void solve()
{
int n;
cin>>n;
string s;
cin>>s;
s="#"+s;
for (int i=1;i<=n;i++){
if(s[i]=='0'){
sum[i]=sum[i-1];
}
else {
sum[i]=sum[i-1]+1;
}
}
double maxn=1.0*1e10;
int ans=0;
for (int i=0;i<=n;i++){
if(sum[i]<=(i/2) && sum[n]-sum[i]>=(n-i+1)/2 ){
if(abs((1.0*n/2-i))<maxn){
maxn=abs((1.0*n/2-i));
ans=i;
}
}
}
cout<<ans<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
D - Seraphim the Owl
在m之前可加上 min(ai,bi) 在m处则计算从1到m的最小情况。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
int a[200010],b[200010];
int f[200010];
int s[200010];
void solve()
{
int n,m;
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a[i];
}
for (int i=1;i<=n;i++){
cin>>b[i];
}
for (int i=1;i<=n;i++){
s[i]=s[i-1]+b[i];
}
int sum=0;
for (int i=n;i>=m+1;i--){
sum+=min(a[i],b[i]);
}
int fl=0;
int maxn=1e18;
for (int i=m;i>=1;i--){
maxn=min(maxn,a[i]+s[m]-s[i]);
}
sum+=maxn;
cout<<sum<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
E - Binary Search
先记录出x的位置,模拟一次二分的过程,如果未找到x则交换一下位置即可。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
int a[200010];
void solve()
{
int n,x;
cin>>n>>x;
int pos=0;
for (int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==x){
pos=i;
}
}
int l=1,r=n+1;
while(l+1<r){
int mid=(l+r)>>1;
if(a[mid]<=x){
l=mid;
}
else {
r=mid;
}
}
if(a[l]==x){
cout<<0<<endl;
return ;
}
else {
cout<<1<<endl;
cout<<pos<<" "<<l<<endl;
}
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
F - Kirill and Mushrooms
应为要考虑最大的值和要维护尽量最小的蘑菇数,所以使用一个优先队列,每次排除最小值
并按照排列的顺序进入。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
int a[200010],b[200010];
void solve()
{
int n;
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
for (int i=1;i<=n;i++) cin>>b[i];
priority_queue<int,vector<int> ,greater<int>> q;
int sum =-1e8;
int cnt=1;
for (int i=n;i>=1;i--){
q.push(a[b[i]]);
while(q.size()>i){
q.pop();
}
if((int)q.size()==i){
int ans=i*q.top();
if(ans>sum){
sum=ans;
cnt=i;
}
else if(ans==sum && i<cnt){
cnt=i;
}
}
}
cout<<sum<<" "<<cnt<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}