Tinkoff Challenge

A:

思路:就是找b,c之前有多个s[i]

代码:

#include<stdio.h>
#define ll long long
using namespace std;
ll a,b,c;
int n;
int s[110000];
int main()
{
while(~scanf("%lld%lld%lld",&a,&b,&c))
{
scanf("%d",&n);
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
if(s[i]>b&&s[i]<c)
sum++;
}
printf("%d ",sum);
}
return 0;
}

B:

题意:把一个等腰三角形分成面积相等的n部分,输出h1,h1+h2,h1+h2+h3,...

思路:先找出第一部分的高h1,然后h1+h2=sqrt(2)*h1,后面每个值都可以通过h1得到。

代码:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int n,h;
double a[1008];
int main()
{
while(~scanf("%d%d",&n,&h))
{
a[0]=h*1.0/sqrt(n);
for(int i=1; i<n-1; i++)
{
a[i]=sqrt(i+1)*a[0];
}
for(int i=0; i<n-1; i++)
i==n-2? printf("%.16f ",a[i]):printf("%f ",a[i]);
}
return 0;
}

C:

题意:Oleg手中有个字符串a,Igor有个字符串b,他们需要构成一个新的字符串c,Oleg的希望是c这个字符串尽可能的小,lgor的希望是c这个字符串尽可能大。从Oleg开始从a中选一个字符放入c中,然后是lgor。

思路:先将a串从小到大排序,b从大到小,如果n为偶数a选取前n/2+1位,否则a,b都选前n/2位。轮到Oleg放置时比较当前a的最小值与b的最大值,如果是小于就把当前a的最小值放在c的前面部分,否则把当前a的最大值放在c的后面部分。轮到lgor放置时比较当前a的最小值与b的最大值,如果是小于就把b当前的最大值放到c的前面部分,否则把b的最小值放在c的后面部分。

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[300005];
char b[300005];
char c[300005];
int vis[300005];
bool cmp1(char aa,char bb)
{
return aa<bb;
}
bool cmp2(char aa,char bb)
{
return aa>bb;
}
int main()
{
while(~scanf("%s",a+1))
{
scanf("%s",b+1);
int n=strlen(a+1);
sort(a+1,a+n+1,cmp1);
sort(b+1,b+n+1,cmp2);
// puts(a+1);
// puts(b+1);
int k=1;
int t=n;
int jj=n/2;
int ii=n/2;
if(n&1)
ii++;
int i=1;
int j=1;
for(int l=1; l<=n; l++)
{
if(l==n&&(l&1))
c[k++]=a[i++];
if(l&1)
{
if(a[i]<b[j])
c[k++]=a[i++];
else
c[t--]=a[ii--];
}
else
{
if(a[i]<b[j])
c[k++]=b[j++];
else
c[t--]=b[jj--];
}
}
c[n+1]='';
puts(c+1);
}
return 0;
}

原文地址:https://www.cnblogs.com/xiejiamin/p/7251151.html