CodeForces - 372A 567C 1141A 471A 450A

一 、Counting Kangaroos is Fun   CodeForces - 372A 
     题目大意:给定n个袋数,只有当a袋鼠的体积大于等于b的两倍时,a才能把b袋鼠放进它的口袋里,b袋鼠一旦被放进a的口袋里,b袋鼠就看不见了(一只袋鼠口袋里最多只能装一只袋鼠,假设a里放了b,就不能再放其他的袋鼠了)。问最后可见的袋鼠最多有多少只
思路:先对这n个数由小到大进行排序,然后从中间位置切成两段(不用考虑奇偶情况)使k=n/2;两段数组下标是[0,k)  [k,n)
第一段数的第一个值与第二段的第一个值进行比较,前者乘2小于等于后者,计数加1,否则,就让第一段的数与第二段的第二个数进行比较。以此类推。
代码:
 

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[500010];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int flag=0;
        int m=n;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        /*int k=a[n-1]/2;
        for(int i=0;i<n;i++)
        {
            if(a[i]>k)
            {
                flag=i;
                break;
            }
        }*/
        int j=n/2;
        for(int i=0;i<n/2;i++)
        {
            for(;j<n;j++)
            {
                if(a[i]*2<=a[j])
                {
                     m--;
                     j++;
                     break;
                }

            }
        }
        cout<<m<<endl;
    }
    return 0;
}

刚做这题时,自己的思路出了错,不是对n分的段,而是排序后,根据最后一个值,找它的1/2的值的位置  假设 2 2 3 4 5 6 7 8 这里从8的一半出4数值处进行切分,这种案例虽成立,但是对于  1 1 1 1 1  2 4,对于这种案例显然是不成立的,因为这样切分,不能得到最理想的值。
 

二、Geometric Progression       567C  
题目大意:在n个数中,找到长度为3的一个子序列,使他们能构成公比为k的等比序列。要求这3个数的索引号是严格递增的.
问在序列中,能找到多少种满足题意的子序列
思路分析:与之前做的一道“给一串数,把这一串分为三段,使三段的和均相等”思路类似。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL long long
int a1[110],a2[110],num[110];
int main()
{
    int n,k,m;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
       LL int sum=0;
       for(int i=0;i<n;i++)
       {
           scanf("%d",&m);
           if(m%k==0)
           {
               sum+=a2[m/k];//最大的数
               a2[m]+=a1[m/k];//满足k=2 
           }
           a1[m]++;//基数  k=1

       }
       cout<<sum<<endl;
    }
    return 0;
}

 

三:Game 23             1141A
题目大意:给两个数,问前一个数需要经过几次   乘2  或  乘3  才能得到后一个数。不能得到就输出-1
代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int coun=0;
        if(m%n!=0) cout<<-1<<endl;
        else if(m==n) cout<<0<<endl;
        else
        {
            int k=m/n;
            int flag=0;
            while(k>1)
            {
                if(k%3==0) { coun++;k/=3;}
                else if(k%2==0) {coun++; k/=2;}
                 else { flag=1;break;}
            }
            if(!flag)cout<<coun<<endl;
             else cout<<-1<<endl;
        }

    }
    return 0;
}

 四、  MUH and Sticks             471A
题目大意:给6个数,问这六个数能不能组成 Bear  或是  
Elephant ,两者都组不成就输出 Alien 
对于 Bear  和  Elephant  均要保证四条腿一样长 ,即数据中要有四个值相等
组成  Bear  的条件是 头短于身体。
组成  Elephant  的条件是  头与身体一样长。
自己开始时认为只要  对于  Bear 来说 有三种数值,个数为1 1 4就可以满足条件 ;  对于 Elephant  来说有两种值,个数为 2 4 就可以满足条件。其他的就输出 Alien。   
题意中有句话,对于头,身体,腿之间的长度关系没有限制(当时读到这句话,只想到了不用考虑 对应现实中 腿 身体 头 应有的比例关系) 但实际上这句话隐含了几种特殊的关系 , 对于 Bear 来说,它的四条腿或许与头的长度相同 ,或者, 四条腿与身体的长度相同 。对于Bear 来说就多了  1  5这种也可以组成 Bear 
对于 Elephant   来说, 它的头和身体  与腿 长度相同的情况也满足条件  6 也满足Elephant 的条件。
代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[7],b[7];
int main()
{
    for(int i=0;i<6;i++)
    {
         scanf("%d",&a[i]);
    }
    sort(a,a+6);
    int cnt=0;
    for(int i=0;i<6;i++)
    {
        if(a[i]==a[i+1])
            b[cnt]+=1;
        else cnt++;
    }
    for(int i=0;i<cnt;i++)
        b[i]+=1;
    sort(b,b+cnt);
    if((b[0]==1&&b[1]==1&&b[2]==4)||(b[0]==1&&b[1]==5)) cout<<"Bear"<<endl;
     else if((b[0]==2&&b[1]==4)||b[0]==6) cout<<"Elephant"<<endl;
     else cout<<"Alien"<<endl;


    return 0;
}

  五、 Jzzhu and Children            450A
题目大意:有n个孩子,每次给孩子m颗糖。接下来的一行,是每个孩子想要的糖的个数,孩子拥有的糖一旦大于等于自己想要的,他就回家,否则他会去队伍的最后再次排队等待发糖,问是哪一个孩子最后回家(输出对应最原始的编号)。
代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[110],b[110],num[110];
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
       memset(num,0,sizeof(num));
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            while(a[i]>0)
            {
                a[i]-=m;
                num[i]++;
            }
        }
        int k=1,maxn=0;
        for(int i=1;i<=n;i++)
        {
            if(num[i]>=maxn)//要糖的次数相同的前提下,最后回家的一定是编号靠后的

            {
                k=i;
                maxn=num[i];
            }
            //maxn=max(maxn,num[i]);//不可以这样,这样找不到索引值

        }

        cout<<k<<endl;
    }
    return 0;
}


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值