Codeforces Round #294 (Div. 2) C

来源:互联网 发布:考古学禁区 知乎 编辑:程序博客网 时间:2024/04/29 20:51

2015/3/1


这场CF送分的。


题目三人一组,新老队员都得有。


考虑下两种极端情况,(一方的人特别多)。

其他就 直接 (n+m)/3.(3的性质=。=为什么?因为,在两方人数都没有优势的情况下,你要组成尽可能多的队伍,也就是把所有人尽可能的算进去)

那么队伍最多是 (n+m)/3,剩下的就是人数不够不能组队。 一老三少,二老1少两种情况都有(单独存在的极端情况之前已经考虑过了)

不必去纠结到底一老三少有几组,二老1少有几组。 真的去计算这些的话就变成了模拟(数据大点就坑你)。

只要知道最优的情况(极端的情况除外)是两种情况搭配就好。


#include<map>#include<queue>#include<stack>#include<cmath>#include<vector>#include<climits>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;  #define mod 10007#define lson pos<<1,l,mid#define sc(n) scanf("%d",&n)#define rson pos<<1|1,mid+1,r#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n))#define F(x,y,i) for(int i = x;i > y; i--)#define f(x,y,i) for(int i = x;i < y; i++)#define ff(x,y,i) for(int i = x;i <= y; i++)#define FF(x,y,i) for(int i = x;i >= y; i--) const int N=100500;const int inf = INT_MAX;int Max(int a,int b){    return a>b?a:b;}int Min(int a,int b){    return  a<b?a:b;}int main()  {      int n, m, tot, x;     while(~scanf("%d%d",&n,&m))    {        int num = 0;                if(m <= n/2)        {            num  = m;        }        else if(n <= m/2)        {            num = n;        }        else        {            num = (n+m)/3;        }                printf("%d\n",num);                 }    return 0;  }  



0 0
原创粉丝点击