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