最有难度的一题是整数分解若干项之和,用了回溯算法,稀里糊涂,以后再写一遍;
#include<iostream>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;
class solution {
private:
vector<int>v;
int n;
int ctn=0;
public:
solution(int nn):n(nn){
v.resize(n);
}
void fenjie(int index,int start,int num);
};
int main() {
int n;
cin >> n;
solution s(n);
s.fenjie(0,1,n);
return 0;
}
void solution::fenjie(int index, int start, int num) {
if (num == 0) {
cout << n << '=';
cout << v[0];
for (int i = 1; i < index; i++) {
cout << '+' << v[i];
}
++ ctn;
if (ctn % 4 != 0 && v[index-1]!=n) {
cout << ';';
}
if (ctn % 4 == 0) {
cout << endl;
ctn = 0;
}
}
else {
for (int i = start; i <= num; i++) {
v[index] = i;
fenjie(index + 1, i, num - i);
}
}
}
总结:还有几题差点意思,今天写了5题,花费2小时。
贴上和网上其他帖子思路不同的两题;
先是整数的分类处理,加上了switch,代码更简洁了
/*#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int arr[n];
int maxn=-1,ctn=0,len=0;
double ave=0.0;
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
if(arr[i]%3==0&&arr[i]>maxn){
maxn=arr[i];
}
if((arr[i]-1)%3==0){
ctn++;
}
if((arr[i]-2)%3==0){
ave+=arr[i];
len++;
}
}
if(maxn!=-1){
printf("%d",maxn);
}else{
printf("NONE");
}
if(ctn){
printf(" %d",ctn);
}else{
printf(" NONE");
}
if(len){
printf(" %.1f",ave/len);
}else{
printf(" NONE");
}
return 0;
}*/
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
int main() {
int n, m;
cin >> n;
int max1 = 0, ctn2 = 0, ctn3 = 0, sum3 = 0;
for (int i = 0; i < n; i++) {
cin >> m;
switch (m%3)
{
case 0:
if (m > max1) {
max1 = m;
}
break;
case 1:
++ctn2;
break;
case 2:
++ctn3;
sum3 += m;
default:
break;
}
}
if (max1) {
cout << max1 << ' ';
}
else {
cout << "NONE ";
}
if (ctn2) {
cout << ctn2 << ' ';
}
else {
cout << "NONE ";
}
if (ctn3) {
cout << setiosflags(ios::fixed);
cout << setprecision(1) << double(sum3) / ctn3;
}
else {
cout << "NONE";
}
return 0;
}
然后是装箱问题
#include<iostream>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;
int main() {
int n,m;
cin >> n;
vector<int>v(n);//init 0
int ctn=0;
for (int i = 0; i < n; i++) {
cin >> m;
for (int j = 0; j < v.size(); j++) {
if (v[j] + m <= 100) {
v[j] += m;
cout << m << ' ' << j+1 << endl;
if (j + 1 > ctn) {
ctn = j + 1;
}
break;
}
}
}
cout << ctn;
return 0;
}