Prefácio: Não tenho tempo para escrever, apenas escrevi o código, não posso garantir que está tudo certo, e as perguntas que escolho são todas simples. A pergunta de retrocesso foi escrita incorretamente por mim, e encontrei outra pessoa para escrevê-la.
Dividir e conquistar:
3. Fatoração de inteiros
Um inteiro positivo n maior que 1 pode ser decomposto em: n=x1×x2×…×xm.
Por exemplo, quando n=12, existem 8 decomposições diferentes:
12=12
12=6×2
12=4×3
12=3×4
12=3×2×2
12=2×6
12=2×3×2
12=2×2×3
entrar:
Os dados têm várias linhas, dado um número inteiro positivo (inteiro positivo menor que 1.000.000)
saída:
Cada saída de dados é uma linha, que é o número de diferentes decomposições do inteiro positivo n.
amostra de entrada
12
35
Saída de amostra
8
3
#include<iostream> #include<stdio.h> using namespace std; int resolve(int n) { int count = 1, i; // ans = 1初始表示n = n的情况 for (i = 2; i * i < n; i++){ if (n % i == 0) // i 是 n的因子, n / i也是n的因子 count += resolve(i) +resolve(n / i); } if (i * i == n) // i是n的因子, 并且i * i == n时只有这一种情况, 左右交换也是一种 count += resolve(i); return count; } int main() { int n; while(scanf("%d",&n)!=-1){ cout<<resolve(n); } return 0; }
programaçao dinamica
4. Problema da etapa
Descrição do problema: Existem n degraus, uma pessoa sobe um ou dois degraus de cada vez e pergunta quantas maneiras de completar os n degraus.
Situação real: Dada uma matriz m, começando no canto superior esquerdo, você só pode ir para a direita ou para baixo a cada vez e, finalmente, chegar ao canto inferior direito. A soma de todos os números no caminho é a soma do caminho e o caminho mínimo a soma de todos os caminhos é retornada, se m for fornecido da seguinte forma, os caminhos 1,3,1,0,6,1,0 são as somas mínimas dos caminhos, retornando 12.
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
#include<iostream> using namespace std; const int N=10; int m[N][N]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>m[i][j]; } } int dp[n][n]={0}; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ dp[i][j]=m[i][j]; } } for(int i=1;i<n;i++){ dp[i][0]+=dp[i-1][0]; } for(int j=1;j<n;j++){ dp[0][j]+=dp[0][j-1]; } for(int i=1;i<n;i++){ for(int j=1;j<n;j++){ dp[i][j]+=min(dp[i-1][j],dp[i][j-1]); } } cout<<dp[n-1][n-1]<<endl; int i=0,j=0; cout<<m[i][j]<<" "; while(true){ if(i==n-1&&j==n-1){ break; } if(dp[i+1][j]>dp[i][j+1]){ cout<<m[i][j+1]<<" "; j++; } else{ cout<<m[i+1][j]<<" "; i++; } } } // 1 3 5 9 // 8 1 3 4 // 5 0 6 1 // 8 8 4 0
ambicioso
1. Problema de conexão de arquivos: Dado um array F de tamanho n, o elemento do array F[i] representa o comprimento do i-ésimo arquivo. Agora, todos os arquivos precisam ser mesclados em um arquivo. Quanto maior o arquivo, mais tempo leva para se conectar a um novo arquivo. Tente fornecer um algoritmo ganancioso para dar a ordem de conexão do arquivo para garantir que o tempo gasto conectando os arquivos seja o mais curto.
#include<iostream> #include<cmath> #include<algorithm> using namespace std; const int N=100; // 文件连接问题:给定一个大小为n的数组F,数组元素F[i]表示第i个文件的长度。 // 现在需要将所有文件合并成一个文件, // 文件越长后面连接成新文件花费的时间越长,试给出贪心算法给出文件连接顺序, // 保证连接文件花费的时间最短。 int main(){ int n; cin>>n; int F[N],P[N]; for(int i=0;i<n;i++){ cin>>F[i]; } for(int i=0;i<n;i++){ P[i]=F[i]; } sort(P,P+n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(P[i]==F[j]){ cout<<j+1<<" "; } } } } // 5 8 1 3 4 9
Traceback:
1. O problema do anel do número primo
(1) Descrição do problema: Insira um inteiro positivo n e forme um anel de inteiros 1, 2, 3, 4...n, de modo que a soma de dois inteiros adjacentes seja um número primo.
(2) Amostra
entrar:
6
saída:
1 4 3 2 5 6
1 6 5 2 3 4
(3) Dica: a árvore do espaço de soluções de busca quando n=4.
#include<iostream> #include<cmath> using namespace std; int n=0; const int N=105; int a[N]; //对应环 int visit[N]={-1}; //标记数组 0表示未用 1表示已用 int check(int k) //判断数字x是否为素数 { int i,n; n=(int)sqrt(k); for(i=2;i<=n;i++) if(k%i==0) return 0; return 1; } void dfs(int step) { if(step==n&&check(a[0]+a[n-1])==1) //全部填满而且第一个元素和最后一个元素满足就输出 { for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; return ; } else { for(int i=2;i<=n;i++) { if(visit[i]==0&&check(i+a[step-1])==1){ //i没有被占用且与前一个元素符合 a[step]=i; visit[i]=1; dfs(step+1); visit[i]=0; } } } } int main(void) { cin>>n; a[0]=1; //因为是环所以第一个元素固定 visit[1]=1; //1已用 dfs(1); //从第一个元素开始 return 0; }