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