2020西安邮电大学ThoughtWorks®联合创新实验室面试题解

2020西安邮电大学ThoughtWorks®联合创新实验室面试题解

  • 题目
      • 1.年轻人我劝你耗子尾汁
      • 2.学生分组问题
      • 3.青蛙过河
      • 4.熊熊的困惑
      • 5.素数和
      • 6.自然之美
      • 7.海涛数对
      • 8.那就是一吧
  • 题解

题目

1.年轻人我劝你耗子尾汁

描述


众所周知,混元形意太极拳马掌门会闪电五连鞭。

其中马掌门每打一鞭需要T秒,每鞭会对对手的HP(生命值初始均为100)造成N点伤害并使对手Rage(怒气值)提高S,年轻人的Rage(怒气值)会随着时间推移而增长,每五秒Rage(怒气值)会增长R;

而且第五鞭会额外对对手造成50%的伤害。但由于69岁的老人,所以每打完一套闪电五连鞭就需要用混元功法回复K秒。

但由于年轻人不讲武德,所以当年轻人的Rage(怒气值)高于60时,可会直接去"偷袭"!,一拳就给马老师KO了。

现在熊熊学长希望你能写个程序告诉他最后是谁KO了谁。

输入


第一行输入一个整数M,表示有M个测试样例 接下来M行,每行有五个整数分别对应 着T,N,S,R,K

T (每打一鞭的时间)
N (每一鞭造成的伤害)
S (受到伤害后怒气值的增长量)
R (随时间怒气的增长量)
K (每打完一套马老回复需要的时间)

输出


请每行输出 “老没有输,马老赢了”或者“ 年轻人不讲武德,年轻人赢了

样例


输入

1
1 8 15 0.5 3

输出

年轻人不讲武德,年轻人赢

输入

2
1.0 17.0 5.0 0.5 2.0
2 10 8 2 1

输出

马老没有输,马老赢了
年轻人不讲武德,年轻人赢了

提示


马老师的绝技的伤害是瞬间打出来的!!!(只是收式要很久)

年轻人的怒气值一满便会直接进行反击!!!,这时他是无敌状态!!!

每五秒加的怒气应当是在第五秒时瞬间加上怒气

2.学生分组问题

描述


有三类人,a,b,c,现在要把这些人分成三个组,a和c类的不能在同一组,问分组后三组的最大组的人数规模最小的是多少。

输入


第一行包含一个整数t (1≤t≤5)=输入中的测试样例数 每个测试用例由一行组成,其中包含三个整数a,b和c (1≤a,b,c≤1000) = 分别为3个类别的人数

输出


对于每一个输入样例都有一个输出值,该值为分组后三组的最大组的人数的最小规模值。

样例


输入

5
3 5 7
4 8 4
13 10 13
1000 1000 1000
13 22 7

输出


5
6
13
1000
14

3.青蛙过河

描述


一只青蛙想要过河。 假定河流被等分为 x 个单元石,并且在每一个单元石内都有可能放有一石子(也有可能没有)。 青蛙可以跳上石头,但是不可以跳入水中。

给定石子的位置列表(用单元石序号升序表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一个石子上)。 开始时, 青蛙默认已站在第一个石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元石1跳至单元石2)。

如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 2、k 或 k + 2个单位。 另请注意,青蛙只能向前方(终点的方向)跳跃。

请注意:

石子的数量 ≥ 2 且 < 1100; 每一个石子的位置序号都是一个非负整数,且其 < 231; 第一个石子的位置永远是0。

输入


输入第一行为n个石子,第二行为每个石子的相对位置用空格间隔

输出


能跳至最后一个石子为true不能则为false

样例


输入

8
0 1 2 3 4 8 9 11

输出

false

输入

7
0 1 4 6 10 15 18

输出

true

4.熊熊的困惑

描述


熊熊和柴柴轮流从n堆中挑选糖果,挑选到最后一个糖果的玩家将赢得最后的胜利。每个回合他们可以从同一堆中挑选任意数量的糖果(不允许不摘糖果)。为了让游戏更有趣,玩家可以将一个堆分成三个较小的堆(没有空堆),而不是选择操作。请找出如果熊熊和柴柴都不出错的话,谁将赢得这场游戏。

输入


第一行输入一个整数T,表示有T个测试样例(1≤T≤100) 接下来输入T行的测试样例,每行都已整数n开头表示有n个堆,接下来输入n个整数s[0],s[1],…,s[n−1],表示每堆糖果的数量(1≤n≤106,1≤s[i]≤109)

输出


对于每一个测试用例,输出一行包括"First player wins.“或者"Second player wins.”

样例


输入

2
2
4 4
3
1 2 4

输出


Second player wins.
First player wins.

提示


Nim博弈,算是策论吧!!!

5.素数和

描述


请设计一个程序,计算出1到n之间的素数之和。

输入


输入一个整数n;

输出


输出1到n之间的素数之和;

样例


输入

10

输出

47

输入

100

输出

1060

输入

999

输出

76127

6.自然之美

描述


自然界中我们可以常见到一些像螺,蜗牛之类的生物,他们的壳都有一道非常优美的曲线——阿基米德螺线(r=aθ)。阿基米德螺线这这里我想让你帮我用程序写出N阶的型如阿基米德螺线的螺旋数组。例如3阶的螺旋数组为:

  • 1 2 3
  • 8 9 4
  • 7 6 5

输入


输入一个整数N,表示请你求出N阶的螺旋数组

输出


输出一个N*N的螺旋数组

样例


输入

5

输出


  1    2    3    4    5
 16   17   18   19    6
 15   24   25   20    7
 14   23   22   21    8
 13   12   11   10    9

输入

20

输出

1     2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
76   77   78   79   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   21
75  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160   95   22
74  143  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  161   96   23
73  142  203  256  257  258  259  260  261  262  263  264  265  266  267  268  219  162   97   24
72  141  202  255  300  301  302  303  304  305  306  307  308  309  310  269  220  163   98   25
71  140  201  254  299  336  337  338  339  340  341  342  343  344  311  270  221  164   99   26
70  139  200  253  298  335  364  365  366  367  368  369  370  345  312  271  222  165  100   27
69  138  199  252  297  334  363  384  385  386  387  388  371  346  313  272  223  166  101   28
68  137  198  251  296  333  362  383  396  397  398  389  372  347  314  273  224  167  102   29
67  136  197  250  295  332  361  382  395  400  399  390  373  348  315  274  225  168  103   30
66  135  196  249  294  331  360  381  394  393  392  391  374  349  316  275  226  169  104   31
65  134  195  248  293  330  359  380  379  378  377  376  375  350  317  276  227  170  105   32
64  133  194  247  292  329  358  357  356  355  354  353  352  351  318  277  228  171  106   33
63  132  193  246  291  328  327  326  325  324  323  322  321  320  319  278  229  172  107   34
62  131  192  245  290  289  288  287  286  285  284  283  282  281  280  279  230  173  108   35
61  130  191  244  243  242  241  240  239  238  237  236  235  234  233  232  231  174  109   36
60  129  190  189  188  187  186  185  184  183  182  181  180  179  178  177  176  175  110   37
59  128  127  126  125  124  123  122  121  120  119  118  117  116  115  114  113  112  111   38
58   57   56   55   54   53   52   51   50   49   48   47   46   45   44   43   42   41   40   39

7.海涛数对

描述


给出一个整数数组haitao[](都为整数),如果在该组数字中存在一对数字满足haitao[i]==haitao[j],并且i

输入


第一行输入数组数据个数n 第二行输入数组数据

输出


输出海涛数对的数目

样例


输入

6
1 2 3 1 1 3

输出


4

输入


4
1 1 1 1

输出


6

提示


  • 数组数据个数上限为500
  • 例1中输出4原因为:

haitao[0]==haitao[3]且0<3>
haitao[0]==hiatao[4]且0<4>
haitao[2]==haitao[5]且2<5>
haitao[3]==haitao[4]且3<4>

共四组海涛数对

8.那就是一吧

描述


给定一个十进制整数N,求其对应2进制数中1的个数

输入


第一个整数表示有T组测试数据,其后T行是对应的测试数据,每行为一个整数N。(1

输出


T行,每行输出对应一个输入。

样例


输入

4
2
100
1000
66

输出

1
3
6
2

提示


所有的N均大于0

题解

1.年轻人我劝你耗子尾汁

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int m;
    scanf("%d", &m);
    double t[m], n[m], s[m], r[m], k[m];
    for (int i = 0; i < m; i++)
    {
        scanf("%lf", &t[i]); //每打一鞭需要T秒
        scanf("%lf", &n[i]); //每鞭会对对手造成N点伤害
        scanf("%lf", &s[i]); //每鞭使对手Rage(怒气值)提高S
        scanf("%lf", &r[i]); //每五秒Rage(怒气值)会增长R
        scanf("%lf", &k[i]); //混元功法回复K秒。
    }
    for (int i = 0; i < m; i++)
    {
        double times = 0.0;
        double time = 0.0;
        double hp = 100.0;
        double rage = 0.0;
        double time_2 = 0.0;

        for (; 1;)
        {
            if (times < 5)
            {
                hp -= n[i];
                times++;
                rage += s[i];
                time += t[i];
            }
            else if (times == 5)
            {
                hp -= (1.5 * n[i]);
                rage += s[i];
            }
            else if (times >= 5)
            {
                times -= 6;
                time += k[i];
            }
            /* hp判断 */
            while (time - time_2 >= 5)
            {
                rage += r[i];
                time_2 += 5;
            }
            /* 怒气值判断 */
            if (rage >= 60)
            {
                printf("年轻人不讲武德,年轻人赢了\n");
                break;
            }
            else if (hp <= 0 && rage < 60)
            {
                printf("马老没有输,马老赢了\n");
                break;
            }
        }
    }

    return 0;
}

2.学生分组问题

#include <stdio.h>
int max(int A,int B,int C);
int main()
{
	int arr[100];
	int N;
	scanf("%d",&N);
	int i=0,a,b,c,t,A,B,C;

	for(t=0;t<N;t++){
		int pd=0;
		scanf("%d %d %d",&a,&b,&c);
		if(a<c){
			A=a;
			B=c/2;
			C=c-c/2;
			pd=1;
			for(;b>0;b--){
				if(A>B){
					if(B>C){
						C++;
						continue;
					}else{
						B++;
						continue;
					}
				}else{
					if(A>C){
						C++;
						continue;
					}
					else{
						A++;
						continue;
					}
				}
			}
		}
		if(pd){
			arr[i]=max(A,B,C);
			i++;
			pd=0;
		}
		if(a>=c){
			A=c;
			B=a/2;
			C=a-a/2;
			pd=1;
			for(;b>0;b--){
				if(A>B){
					if(B>C){
						C++;
						continue;
					}
					else{
						B++;
						continue;
					}
				}else{
					if(A>C){
						C++;
						continue;
					}
					else{
						A++;
						continue;
					}
				}
			}
		}
		if(pd){
		arr[i]=max(A,B,C);
		i++;
		pd=0;
		}	
	}
	for(int j=0;j<i;j++)
		printf("%d\n",arr[j]);
	return 0;
}

int max(int A,int B,int C){
	int m;
	if(A>B){
		if(A>C)
			m=A;
		else
			m=C;
	}else{
		if(B>C)
			m=B;
		else
			m=C;
	}
	return m;
}

青蛙过河

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int n = 0;
    scanf("%d", &n);
    int a[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int q = 1;
    for (int i = 0; i < n - 1; i++)
    {
        if (a[1] - a[0] != 1)
        {
            printf("false\n");
            return 0;
        }
        
        int w = a[i + 1] - a[i];
        if (w <= (q + 2) && w >= (q - 2))
        {
            q = w;
        }
        else
        {
            printf("false\n");
            return 0;
        }
    }
    printf("true\n");
    return 0;
}

4.熊熊的困惑

#include<stdio.h>
int main(void)
{
	int a,b[10],c[100],d,i,m[100],n;
	scanf("%d",&a);
	for(i=1;i<=a;i++)
	{
		scanf("%d",&b[i]);
		for(n=1;n<=b[i];n++)
		{
			scanf("%d",&m[n]);
			c[i]=c[i]+m[n];
		}
	}
	for(i=1;i<=a;i++)
	{
		if(c[i]%2==0)
		printf("Second player wins.\n");
		else
		printf("First player wins.\n");
	}
	return 0;
 } 

5.素数和

#include<stdio.h>
int main()
{
	int n=0,x=2;
	scanf("%d",&n);
	 for(int i=2;i<=n;i++)
	   {
	   	 for(int j=2;j<i;j++)
	   	 {
	   	 	if(i%j==0)
	   	 	 break;
	   	 	 if(j==i-1)
	   	 	 x+=i;
			}
				
	   }
	printf("%d",x);
	return 0;
}

6.自然之美

#include<stdio.h>
int main(void)
{
	int N,n,i,j,num=1;
	int a[100][100];
	scanf("%d",&N);
	for(n=1;n<=N;n++){
		for(i=n;i<=N-n+1;i++)
			a[n][i]=num++;
		for(j=n+1;j<=N-n+1;j++)
			a[j][i-1]=num++;
		for(i=N-n;i>=n;i--)
			a[j-1][i]=num++;
		for(j=N-n;j>=n+1;j--)
			a[j][i+1]=num++;
	}
	for (int i=1; i<=N; i++)
	{
		for (int j=1; j<=N; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

7.海涛数对

#include<stdio.h>
int main()
{
	int i,j,a[500],n,t,sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{
		for(j=n-1;i<j;j--)
	{
		if(a[i]==a[j])
		{
			sum++;
		}
		else
			continue;
		}
	}
	printf("%d",sum);
	return 0;
}

8.那就是1吧

#include <stdio.h>
int main(void)
{
    int n;
    scanf("%d", &n);
    int a[n];
    int t,h;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for (int i = 0; i < n; i++)
    {
        t=0;
      while(a[i]>0)
        {
           h=a[i]%2;
           a[i]/=2;
           if(h==1){
           	t++;
		   }
        }
        printf("%d\n", t);
    }
    return 0;
}

看完点赞加关注!(=3=)

你可能感兴趣的:(笔记,c语言)