Codeforces Round #345 (Div. 2)

Codeforces Round #345 (Div. 2)


A.
题意:a,b进行游戏,游戏机的电量分别剩余n,m;充电器只能给一个人充电,一分钟充1%的电,不充电的一分钟掉电2%。问两个人能同时进行几分钟游戏。

思路:模拟就好了。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;

int n,m;
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int ans=0;
        if(n==1 && m==1 ) {printf("0\n"); continue;}
        while(n>0 && m>0)
        {
            if(n<m)
            {
                int temp=n;
                n=m;
                m=temp;
            }
            n-=2;
            m++;
            ans++;
            //printf("%d\n",ans);
        }
        printf("%d\n",ans);
    }
    return 0;


B.
题意: 如果遇到比前一个更漂亮的画心情就会好一些。

思路:xjb搞过的,蜜汁~

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;

int n;
int b[1200];
vector<int > a[1200];
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int mm=0;
        int ans=0;
        memset(b,0,sizeof(b));
        for(int i=0; i<1200; i++)
            a[i].clear();
        for(int i=1; i<=n; i++)
        {
            int x;
            scanf("%d",&x);
            b[x]++;
            a[b[x]].push_back(x);
            mm=max(mm,b[x]);
        }
        //for(int i=1; i<=mm; i++)
       //     for(int j=0; j<a[i].size(); j++)
         //       cout << a[i][j] << ' ';
        //cout << endl;
        for(int i=1; i<=mm; i++)
        {
            //cout << a[i].size() << endl;
            if(a[i].size()>0)
            ans+=a[i].size()-1;
        }
        printf("%d\n",ans);
    }
    return 0;
}  


C.
题意:
传统的路程计算方式是:sqrt( (xi-yi)^2+(xj-yj) );
贝尔曼路程的计算方式是:|xi-xj|+|yi-yj|;
然后有一群点,找到两种计算方式得到的结果一样的对数,(就是xixj || yiyj);

思路:
如果单独计算x或者y的话会产生多余对数,可以先记录在一个位置的点然后对x,y排序计算。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;int n;
struct node
{
    LL x,y;
};
node a[200000+100];
bool cmp1(node aa,node bb)
{
    if(aa.x==bb.x)
        return aa.y<bb.y;
    else
        return aa.x<bb.x;
}
bool cmp2(node aa,node bb)
{
    if(aa.y==bb.y)
        return aa.x<bb.x;
    else
        return aa.y<bb.y;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        LL ans=0;
        LL sum=0;
        memset(a,inf,sizeof(a));

        for(int i=0; i<n; i++)
        {
            scanf("%I64d %I64d", &a[i].x, &a[i].y);
        }

        sort(a,a+n,cmp1);
        for(int i=0; i<n; i++)
        {
            if(a[i].x==a[i+1].x && a[i].y==a[i+1].y)
            {
               sum++;
            }
            else
            {
                ans-=sum*(sum+1)/2;
                sum=0;
            }
        }

        sum=0;
        for(int i=0; i<n; i++)
        {
            if(a[i].x==a[i+1].x)
            {
                sum++;
            }
            else
            {
                ans+=sum*(sum+1)/2;
                sum=0;
            }
        }
        sum=0;
        sort(a,a+n,cmp2);
        for(int i=0; i<n; i++)
        {
            if(a[i].y==a[i+1].y)
            {
                sum++;
            }
            else
            {
                ans+=sum*(sum+1)/2;
                sum=0;
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}  


posted @ 2016-03-10 22:57  zzuli_柚子  阅读(142)  评论(0编辑  收藏  举报