ios面接アルゴリズム問題(5)——トランプカード、最小と差の問題、V字図形印刷
今日は皆さんにいくつかの面白いアルゴリズムを紹介します.最適化はあまりよくありません.考えのある皆さん、交流してください.
1、プログラムシミュレーション52枚のカードをランダムに4人のプレイヤーに送信する(サイズ王を除く)
第二に、奇数文字を入力し、V字図形を印刷する
3、綱引きのルールは全員をA B両チームに分け、力の強い方が勝つ
最初は一人一人の力がどれほど大きいか分からなかったので、司会者はグループに分かれて次の戦略を決めました.
一人一人の体重に応じてできるだけ均等に分配する
割り当てられたポリシーは次のとおりです.
1. A B両チームの人数差<=1
2. A B両チームの合計の差は絶対値が最小である
==============
例えば、あるクラスにN(奇数または偶数)の個人がいて、番号は0、1、2、...(N-1)
誰もが自分の体重を持っています
たとえば
W0, W1, W2, ... W(N-1)
どのように試合の両チームの人数を分配して、双方の人の体重の総和の差が最も小さいことを保証します
A B両チームの総体重を印刷します(小さいから大きいまで)
例えば、7人、体重はそれぞれ
100 90 200 220 130 120 110
出力:
470
500
人数に応じて自動的に集計するプログラムを設計してください
注意入力するときに最初に入力する人の数、例えば7人
続いて7人分の体重を入力します
7 100 90 200 220 130 120 110
バランスの二叉木でできるそうで、怠け者になりたいので、再帰貧挙法で太鼓を叩いた(笑わないで)
1、プログラムシミュレーション52枚のカードをランダムに4人のプレイヤーに送信する(サイズ王を除く)
//
// main.c
// randPoke
//
// Created by cuixuerui on 15/12/24.
// Copyright (c) 2015 cuixuerui. All rights reserved.
//
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
typedef struct{
int colo;
int num;
} POKE;
char *color[4]={"♠️","♣️","♥️","♦️"};
char *num[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
int main(int argc, const char * argv[]) {
srand((int)time(NULL));
POKE poke[52];
for(int c=0;c<52;c++)
{
// ,
poke[c].num=14;
poke[c].colo=5;
}
/*
: 0-51
1:0-12
2:13-25
3:26-38
4:39-51
, 0-52 , ,
*/
int count=0;
int j=0;
int k=0;
while (count<=51) {
int num=rand()%13;//
int color=rand()%4;
int flag=0; //
for (int i=0; i<52; i++) {
if (poke[i].colo==color&&poke[i].num==num) {
flag=1; //
}
}
if (flag==0) {//
poke[j].colo=color;
poke[j].num=num;
j=j+13;//
count++;//
if (j>39+k) {// ,
k++;
j=k;
}
}
}
for (int i=0; i<52; i++) {
if (i==0) {
printf(" 1
");
}else if(i==13)
{
printf("
2
");
}else if (i==26)
{
printf("
3
");
}else if (i==39)
{
printf("
4
");
}
printf("%s%s ",color[poke[i].colo],num[poke[i].num]);
}
return 0;
}
第二に、奇数文字を入力し、V字図形を印刷する
//
// main.c
//
//
// Created by qianfeng on 15/12/8.
// Copyright (c) 2015 cuixuerui. All rights reserved.
//
#include <stdio.h>
/*
5. , , 。(15 )
:"abcdefg"
:
a g
b f
c e
d
*/
int inputAndLength(char str[]);
int main(int argc, const char * argv[]) {
char str[20];
//int i=0;
int length;
printf(" ( ):
");
//
length=inputAndLength(str);
// , ,
while (length%2==0)
{
printf(" ! :
");
length=inputAndLength(str);
}
//length/2+1 ,7 4
for(int i=0; i<length/2+1; i++) {
//
for (int j=0; j<=i-1; j++) {
printf(" ");
}
//
printf("%c",str[i]);
/*
//
//(length-2)-2*i
:length=7
str[0]-----5
str[1]-----3
str[2]-----1
*/
for (int j=(length-2)-2*i; j>0;j--) {
printf(" ");
}
//
if (i!=length/2) {
printf("%c",str[length-i-1]);
}
//
printf("
");
}
return 0;
}
int inputAndLength(char str[])
{
int i=0;
do{
scanf("%c",&str[i]);
//
if (str[i]=='
') {
break;
}
i++;
}while(1);
return i;
}
3、綱引きのルールは全員をA B両チームに分け、力の強い方が勝つ
最初は一人一人の力がどれほど大きいか分からなかったので、司会者はグループに分かれて次の戦略を決めました.
一人一人の体重に応じてできるだけ均等に分配する
割り当てられたポリシーは次のとおりです.
1. A B両チームの人数差<=1
2. A B両チームの合計の差は絶対値が最小である
==============
例えば、あるクラスにN(奇数または偶数)の個人がいて、番号は0、1、2、...(N-1)
誰もが自分の体重を持っています
たとえば
W0, W1, W2, ... W(N-1)
どのように試合の両チームの人数を分配して、双方の人の体重の総和の差が最も小さいことを保証します
A B両チームの総体重を印刷します(小さいから大きいまで)
例えば、7人、体重はそれぞれ
100 90 200 220 130 120 110
出力:
470
500
人数に応じて自動的に集計するプログラムを設計してください
注意入力するときに最初に入力する人の数、例えば7人
続いて7人分の体重を入力します
7 100 90 200 220 130 120 110
バランスの二叉木でできるそうで、怠け者になりたいので、再帰貧挙法で太鼓を叩いた(笑わないで)
//
// main.c
// ( )
//
// Created by qianfeng on 15/12/15.
// Copyright (c) 2015 cuixuerui. All rights reserved.
//
#include <stdio.h>
#define MAX_SIZE 125
/*
A B ,
, :
:
1. A B <= 1
2. A B
==============
N( ) , 0, 1, 2, ... (N-1)
,
W0, W1, W2, ... W(N-1)
,
A B ( )
: 7 ,
100 90 200 220 130 120 110
( ):
470
500
,
, 7
7
7 100 90 200 220 130 120 110
*/
int addNum(int num[],int m,int k);
float avg;
int a[100],end;
int temp;
int result=0;
int main(int argc, const char * argv[]) {
int sum=0;
int weight[20];
weight[0]=2;
for (int i=0; i<=weight[0]; i++) {
scanf("%d",&weight[i]);
}
int length=weight[0];
//
for(int i=1;i<=length;i++)
{
sum=sum+weight[i];//sum
}
avg=sum/2;
end=length/2;
temp=avg;
int num1=addNum(weight, length, end);
int num2=sum-num1;
int min=num1<num2?num1:num2;
printf("%d
%d",min,sum-min);
return 0;
}
/*
num[] k ,
*/
int addNum(int num[],int m,int k)
{
int i,j;
int sum=0;
for(i=m;i>=k;i--)
{
a[k]=num[i];// m,m-1,m-2.....k
if(k>1) addNum(num,i-1,k-1);//
else
{
sum=0;
for(j=1;j<=end;j++)
{
sum=sum+a[j];
}
//printf("%d
",sum);
int sub=sum-avg;
if (sub<0) {
sub=-sub;//
}
if (sub<temp) {
temp=sub;
result=sum;
}
//printf(" :%d
",result);
//return result;
}
}
return result;
}