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;
}


   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章