过拟合是机器学习模型训练过程中常见的问题。当一个模型在训练数据上表现非常好,但在测试数据上表现不佳时,就被认为存在过拟合问题。当模型过于复杂或训练数据量不足时,通常会出现这种情况。为了减少过拟合,研究人员提出了各种技术,如正则化、数据增强和交叉验证。正则化方法在损失函数中引入惩罚项来限制模型参数的大小,从而使模型更简单、更稳定。数据增强通过对原始数据应用旋转、裁剪或添加噪声等操作来增加训练数据的多样性。此外,交叉验证通过反复将数据集拆分为训练集和验证集来评估模型的泛化能力。这些技术可以有效地提高机器学习模型在现实应用中的性能。
52
#include<bits/stdc++.h>
using namespace std;
int main(){
int num,sq;
while(scanf("%d",&num)!=EOF){
int total=0;
int arr[10001];
int valid[10001]={0};
for(int i = 0;i<=10000;i++){
if(total<num){
arr[i]=i;
total+=i;
sq=i;
}else{
arr[total-num]=0;
break;
}
}
int flag=0;
for(int i=0;i<=sq;i++){
if(arr[i]!=0){
if(flag){
printf(",");
}
flag=1;
printf("%d",arr[i]);
}
}
printf("\n");
}
}
53
#include <iostream>
#include <vector>
using namespace std;
// 判断num在base进制下是否为回文数
bool isPalindrome(int num, int base) {
vector<int> digits;
if (num == 0) return true; // 0在任何进制都是回文,但本题num>S>0,不会用到
while (num > 0) {
digits.push_back(num % base);
num /= base;
}
// 回文数首位不能为0(digits最后一位是最高位)
// if (digits.back() == 0) return false;
// 首尾对比
int left = 0, right = digits.size() - 1;
while (left < right) {
if (digits[left] != digits[right]) return false;
left++;
right--;
}
return true;
}
// 判断num是否是双重回文数(2~10进制中至少2种是回文)
bool isDoublePalindrome(int num) {
int cnt = 0;
for (int base = 2; base <= 10; base++) {
if (isPalindrome(num, base)) {
cnt++;
if (cnt >= 2) return true; // 满足条件,提前退出
}
}
return false;
}
int main() {
int N, S;
cin >> N >> S;
int found = 0;
int num = S + 1;
while (found < N) {
if (isDoublePalindrome(num)) {
cout << num << endl;
found++;
}
num++;
}
return 0;
}
54
#include <iostream>
#include <vector>
#include <set> // 替换 unordered_set 为 set
#include <algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
// 1. 生成所有双平方数,去重并记录最大值
set<int> s_set; // 红黑树集合,O(logn)查询(替换原unordered_set)
vector<int> s_list; // 存储所有双平方数,用于枚举a
int max_num = 0;
for (int p = 0; p <= M; ++p) {
int p2 = p * p; // 提前计算,避免重复乘法
for (int q = 0; q <= M; ++q) {
int num = p2 + q * q;
if (s_set.insert(num).second) { // set的insert返回值和unordered_set完全一致
s_list.push_back(num);
if (num > max_num) max_num = num;
}
}
}
sort(s_list.begin(), s_list.end()); // 排序a,保证输出有序
int list_len = s_list.size();
vector<pair<int, int>> res; // 存储(a, b)
// 2. 枚举a,再按b步进验证(核心优化:减少无效枚举)
for (int a : s_list) {
// b的最大可能值:a + (N-1)*b ≤ max_num → b ≤ (max_num - a)/(N-1)
int max_b = (max_num - a) / (N - 1);
if (max_b <= 0) continue; // b必须为正整数
// 枚举b的可能值(从1到max_b)
for (int b = 1; b <= max_b; ++b) {
bool valid = true;
// 验证后续N-1项是否都在集合中
for (int k = 1; k < N; ++k) {
int current = a + k * b;
if (s_set.find(current) == s_set.end()) { // set的find用法和unordered_set完全一致
valid = false;
break; // 提前终止,无需验证剩余项
}
}
if (valid) {
res.emplace_back(a, b);
}
}
}
// 3. 按b升序、a升序排序输出
sort(res.begin(), res.end(), [](const pair<int, int>& x, const pair<int, int>& y) {
if (x.second != y.second) return x.second < y.second;
return x.first < y.first;
});
// 4. 输出结果
if (res.empty()) {
cout << "NONE" << endl;
} else {
for (auto& p : res) {
cout << p.first << " " << p.second << endl;
}
}
return 0;
}