C语言小测4

*爱你&永不变心* 提交于 2020-01-01 05:19:59

C语言小测4

  1. 幼儿园霸王

幼儿园里面的小朋友在玩橡皮泥,每一个小朋友都有一块橡皮泥。每一块橡皮泥都是一个长方体块。从橡皮泥的大小可以看出哪一个小朋友是老大,哪一个小朋友是小弟。拥有橡皮泥体积最大的小朋友总喜欢欺负拥有橡皮泥体积最小的小朋友。
现在给出n个小朋友的橡皮泥,请输出谁欺负了谁。
输入:
单组测试数据。
第一行有一个整数n(2<=n<=9)。
接下来有n行,每行给出一个小朋友的信息,三个整数和小朋友的名字,前面三个整数表示长方体块的长宽高。
小朋友的名字非空且不超过8个字符。每一个橡皮泥的体积不超过25000立方单位。
输入保证只有一个小朋友的橡皮泥的体积是最大的,并且只有一个小朋友的橡皮泥的体积是最小的。

输出:
输出两个名字A和B中间用空格分开,表示A欺负了B。
输入样例:
3
10 10 2 J
5 3 10 W
5 5 10 B

输出样例:
B W

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d",&n);
    char maxName[8];
    char minName[8];
    int maxValue = INT_MIN;
    int minValue = INT_MAX;
    int l,w,h;
    char name[8];
    while(n--){
        scanf("%d%d%d%s\n",&l,&w,&h,&name);
        int value = l*w*h;
        if(value > maxValue){
            maxValue = value;
            strcpy(maxName,name);
        }
        if(value < minValue){
            minValue = value;
            strcpy(minName,name);
        }
    }
    printf("%s %s",maxName,minName);

    return 0;
}
  1. 吃葡萄

在房间中G颗葡萄,现在有n个人。这n个人依次进入房间吃葡萄。每个人进去的时候都做如下操作,把葡萄分成n等份,发现还多出一颗,然后吃掉这一颗以及n等份中的一份,然后走出房间。这n个人吃完之后,最后房间里面的葡萄刚好可以分成n等分。问n最大是多少?
输入:
多组测试数据。
第一行输入一个整数T(1<=T<=200),表示测试数据的数目。
接下来T行,每一行一个整数G(1<=G<= 4000)

输出:
对于每一组数据,输出一个整数表示最大的人数,如果无解输出No Solution。
输入样例:
样例输入1
2
25
30

输出样例:
样例输出1
3
No Solution

#include <stdio.h>
#include <stdbool.h>
int eatGraph(int n){
    for(int i=n;i>1;--i){       // 人数i从n到2进行判断
        int t = n;              // 保存葡萄数
        bool ok = true;         // 假设能够完美分配
        for(int j=0;j<i;++j){   // 模拟i人分葡萄
            int s = t-1;        // 先吃掉1颗
            if(s%i!=0) {        // 判断能否按人数平均分配
                ok = false;     // 不能成功分配
                break;
            }else{
                t = s - s/i;    // 计算剩余葡萄数
            }
        }
        if(ok && t%i == 0){     // 剩余的最后平分
            return i;
        }
    }
    return -1;// 没有满足的情况
}
int main(){
    int n;
    scanf("%d",&n);
    int nums[n];
    for(int i=0;i<n;++i){
        //scanf("%d",&nums[i]);
        scanf("%d",nums+i);
    }
    for(int i=0;i<n;++i){
        int m = eatGraph(nums[i]);
        if(-1 != m){
            printf("%d\n",m);
        }else{
            printf("No Solution\n");
        }
    }
}
  1. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4

//leetcode

int singleNumber(int* nums, int numsSize){
	int xor=0;
	for(int i=0;i<numsSize;i++){
        xor=nums[i]^xor;
	}
	return xor;
}
  1. 缺失数字

给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。

示例 1:
输入: [3,0,1]
输出: 2

示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8

//leetcode

int missingNumber(int* nums, int numsSize){
    int xor = 0;
    for (int i = 0; i < numsSize; i++) {
        xor ^= nums[i];
        xor ^= i;
    }
    xor ^= numsSize;
    return xor;
}
  1. 三个数的最大乘积

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6

示例 2:
输入: [1,2,3,4]
输出: 24

//leetcode

int cmp(const void* a,const void* b){
    return ( *(int*)a - *(int*)b );
}
int maximumProduct(int* nums, int numsSize){
    int max1, max2;
    qsort(nums,numsSize,sizeof(int),cmp);
    max1 = nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3];
    max2 = nums[0] * nums[1] * nums[numsSize-1];
    return max1 > max2 ? max1 : max2;
}
  1. 寻找数组的中心索引

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。
我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
示例 1:
输入:
nums = [1, 7, 3, 6, 5, 6]
输出: 3
解释:
索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。

示例 2:
输入:
nums = [1, 2, 3]
输出: -1
解释:
数组中不存在满足此条件的中心索引。

//leetcode

int pivotIndex(int* nums, int numsSize){
    int sum = 0,leftsum = 0;
    for(int i = 0;i < numsSize;i++)
        sum = sum + nums[i];
    for(int i = 0;i < numsSize;i++){
        if(leftsum * 2 == sum - nums[i])
            return i;
        leftsum = leftsum + nums[i];
    }
    return -1;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!