力扣每日一题
你和你的朋友,两个人一起玩 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;
}