2021-09-18每日刷题打卡

力扣每日一题

292. Nim 游戏

你和你的朋友,两个人一起玩 Nim 游戏:

桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 1 - 3 块石头。
拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。

示例 1:

输入:n = 4
输出:false 
解释:如果堆中有 4 块石头,那么你永远不会赢得比赛;
     因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

一开始没搞懂,细想了一下后发现,自己必输的情况只有剩下的石头是4且是你先拿的情况,其余的情况都能赢,那么就很简单了,直接对石头数n取4的余数,判断余数大小,如果是等于0,说明剩下的石头是4,我必输;如果大于0则必有赢的机会。

class Solution {
public:
    bool canWinNim(int n) {
        int num=0;
            num=n%4;
            if(num==0)
            {
                return false;
            }else{
                return true;
            }
   
        return {};
    }
};

洛谷

P5736 【深基7.例2】质数筛

题目描述

输入 n(n\le100)n(n≤100) 个不大于 100000 的整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。

输入输出样例

输入 #1

5
3 4 5 6 7

输出 #1

3 5 7

质数就是只能被1和它本身整除的数,那我们便写一个for循环,从2到n-1依次对n进行取余,如果取余有一个为0,说明这不是质数,不输入这个数,如果是质数再插入vector中。要注意的是1不算质数,所以我们检索的应该是大于1的数(一开始没注意吃了个WA),先判断数是否大于1,大于1再进行如上操作。

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<list>
#include<string>
#include <set> 


int main()
{
	vector<int>v;
	int num,n;
	bool b = true;
	cin >> n;
	while(n--) {
		cin >> num;
		if (num > 1)
		{
			for (int i = 2; i < num; i++)
			{
				if (num % i == 0)
				{
					b = false;
					break;
				}
			}
			if (b)
			{
				v.push_back(num);
			}
			b = true;
		}
	}
	for (auto i : v)
		cout << i << " ";
	
	return 0;
}

P5738 【深基7.例4】歌唱比赛

题目描述

n(n\le 100)n(n≤100) 名同学参加歌唱比赛,并接受 m(m\le 20)m(m≤20) 名评委的评分,评分范围是 0 到 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m-2m−2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 2 位小数。

输入输出样例

输入 #1

7 6
4 7 2 6 10 7
0 5 0 10 3 10
2 6 8 4 3 6
6 3 6 7 5 8
5 9 3 3 8 1
5 9 9 3 2 0
5 8 0 4 1 10

输出 #1

6.00

设置一个for循环来输入各个选手,里面嵌套一个for循环配合vector接收评委的分数,接收完后用sort对容器进行排序,再通过一个for循环来计算除去最低分和最高分的分数的总和(从数组下标1开始到 容器.size()-1,忽略最低和最高的数),计算出平均数后存入另一个vector容器里(注意得是double类型,不然不符合题目两位小数的标准),将原来的那个容器清空好去存放下一位选手得分。存完所有选手平均成绩后用sort对存放平均成绩的容器排序,输出最后一个数,那个数就是最高的得分

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<list>
#include<string>
#include <set> 
#include <iomanip>


int main()
{
	vector<int>v;
	vector<double>ave;
	int m,n,num;
	double sum=0,math;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> num;
			v.push_back(num);
		}
		sort(v.begin(), v.end());
		for (int k = 1; k < v.size() - 1; k++)
		{
			sum += v[k];
		}
		v.clear();
		math = sum / ( m - 2);
		sum = 0;
		ave.push_back(math);
	}
	sort(ave.begin(), ave.end());
	cout << setiosflags(ios::fixed) << setprecision(2);
	cout << ave[ave.size() - 1] << endl;
	
	
	return 0;
}

P5739 【深基7.例7】计算阶乘

题目描述

求 n!(n\le12)n!(n≤12),也就是 1×2×3...×n1×2×3...×n。

挑战:尝试不使用循环语句(for、while)完成这个任务。

输入输出样例

输入 #1

3

输出 #1

6

其实说到阶乘就想着用递归(最近正在学)了,正好题目要求不使用for和while,那就写一个递归来算阶乘。

这个递归函数需要两个参数值,一个是阶乘的阶数n,另一个是阶乘的结果num(num初始值要为1),为了省事num用引用的方式传递。阶乘函数接收n后,判断n是否大于1,如果大于一就先把num乘上n的值,然后在调用一次阶乘函数,把n-1和num传进去。当n=1时递归结束,输出num。

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<list>
#include<string>
#include <set> 
#include <iomanip>

void jiecheng(int n, int& num)
{
	if (n > 1)
	{
		num *= n;
		jiecheng(n - 1, num);
	}
	else {
		n = 1;
	}
}

int main()
{
	int n,num = 1;
	cin >> n;
	jiecheng(n, num);
	cout << num;
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值