https://codeforces.com/problemset/problem/1221/C
就这道水题,我WA了以后把D写完了才回来用一个巨复杂的做法做掉了
然而蔡队用的二分,c+m-mid*2+x>=mid表示c和m中各取mid个剩下的+x>=mid就可以组成mid队
#include <bits/stdc++.h>
using namespace std;
int main() {
int q;
scanf("%d", &q);
while(q--) {
int c, m, x;
scanf("%d%d%d", &c, &m, &x);
int l = 0, r = 1e8, ans;
while(l <= r) {
int mid = l + r >> 1;
if (c >= mid && m >= mid && c + m - mid * 2 + x >= mid) {
ans = mid, l = mid + 1;
} else {
r = mid - 1;
}
}
printf("%d\n", ans);
}
}
然而还可以直接公式,因为取c,m较小得保证了每个队都有c和m一个,然后剩下的就无论是x还是c还是m都行,就是(c+m+x)/3
#include<bits/stdc++.h>
using namespace std;
using LL=long long;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T;
cin>>T;
while(T--){
int c,m,x;
cin>>c>>m>>x;
cout<<min(c,min(m,(c+m+x)/3))<<endl;
}
return 0;
}
我的辣鸡代码,太菜了啊
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,ans;
int c,m,x;
char s[maxl];
inline void prework()
{
scanf("%d%d%d",&c,&m,&x);
}
inline void mainwork()
{
ans=0;
int t=min(min(c,m),x);
c-=t;m-=t;x-=t;
ans+=t;
while(c>0 && m>0 && c+m>=3)
{
if(c<m)
{
if(c>=3)
{
t=min(c/3,m/2);
c-=t;m-=2*t;
ans+=t;
}
else
{
if(c==2)
{
if(m>=4)
{
ans+=2;
return;
}
else if(m>=2)
{
ans++;
return;
}
}else if(m>=2)
ans++;
return;
}
}
else
{
if(m>=3)
{
t=min(c/2,m/3);
c-=2*t;m-=t;
ans+=t;
}
else
{
if(m==2)
{
if(c>=4)
{
ans+=2;
return;
}
else if(c>=2)
{
ans++;
return;
}
}else if(c>=2)
ans++;
return;
}
}
}
}
inline void print()
{
printf("%d\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}