目录
1.笨小猴
哈希存储之后再判断再判断是否为质数。
#include <iostream>
using namespace std;
bool Check_zs(int x)
{
if (x < 2)
return false;
for (int i = 2; i < x; ++i)
if (x % i == 0)
return false;
return true;
}
int cnt_max = 0;
int cnt_min = 101;
int cnt[128];
int main() {
string s;
cin >> s;
for (auto c : s)
cnt[c]++;
for (int i = 65; i < 128; ++i)
{
if (cnt[i] > cnt_max)
cnt_max = cnt[i];
if (cnt[i] < cnt_min && cnt[i] != 0)
cnt_min = cnt[i];
}
if (Check_zs(cnt_max - cnt_min))
{
cout << "Lucky Word" << endl;
cout << cnt_max - cnt_min << endl;
}
else
{
cout << "No Answer" << endl;
cout << 0 << endl;
}
return 0;
}
2.主持人调度
只需要判断后一个的开始是否大于等于前一个的结束即可但是:
我以为这个数组本就是有序的,所以直接开始遍历了,还导致找不出错在哪,这道题得先排序,再遍历
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param schedule int整型vector<vector<>>
* @return bool布尔型
*/
bool hostschedule(vector<vector<int> >& schedule) {
int n = schedule.size();
int l = schedule[0][0];
// 先排序
sort(schedule.begin(), schedule.end());
// 之间比较后一个的开始与前一个的结束
long long r = schedule[0][1];
for (int i = 1; i < n; ++i) {
if (schedule[i][0] < r)
return false;
else {
l = schedule[i][0];
r = schedule[i][1];
}
}
return true;
}
};
3.分割等和子集
将题意变换为求是否能凑出和的为总和一半的数组。
bool值动态规划dp:
搞清状态表示,就好分析多了,即为01背包,类似模版题,只是改为bool值的dp
还有就是若sum % 2 != 0可以直接打印false了,因为不可能分为两等份
#include <iostream>
using namespace std;
int n;
bool dp[510][510 * 110 / 2];
int arr[510];
int main() {
cin >> n;
int sum = 0;
for(int i = 1; i <= n; ++i)
{
cin >>arr[i];
sum += arr[i];
}
if(sum % 2 != 0) cout << "false" << endl;
else
{
// 初始化
for(int i = 0; i <= n; ++i)
dp[i][0] = true;
int mid = sum / 2;
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= mid; ++j)
{
dp[i][j] = dp[i - 1][j];
if(j >= arr[i])
dp[i][j] = dp[i - 1][j] || dp[i - 1][j - arr[i]];
}
}
if(dp[n][mid]) cout << "true" << endl;
else cout << "false" << endl;
}