进阶12:给定一个以秒为单位的时间t,要求用"<H>:<M>:<S>"的格式来表示这个时间。<H>表示时间,<M>表示分钟,而<S>表示秒,它们都是整数且没有前导的"0"。例如,若t=0,则应输出是"0:0:0";若t=3661,则输出"1:1:1"。
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
int ansH=0,ansM=0,ansS=0;
ansS = n;
while(ansS>=60){
ansS-=60;ansM+=1;
}
while(ansM>=60){
ansM-=60;ansH+=1;
}
cout<<ansH<<':'<<ansM<<':'<<ansS<<endl;
system("pause");
}
基础79:该阵列由n个正整数构成,阵列中的数字从1开始递增,数字的排序规则是从1开始由中间逆时针向外转出,2出现在1的下面,然后直至输出n为止。
例如当n=5的时候,阵列如下:
5
1 4
2 3
当n=9时,阵列如下:
7 6 5
8 1 4
9 2 3
当n=10时,阵列如下:
7 6 5
8 1 4
9 2 3
10
cpp
#include <bits/stdc++.h>
using namespace std;
int targetNum;
void PrintM(vector<vector<int>>&matrix,int di){
for(int i=0;i<di;i++){
for(int j=0;j<di;j++){
cout<<matrix[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
void Create(vector<vector<int>>&matrix,int &indexR,int &idnexC,
int di,int &num,int &loop){
//cout<<loop<<"-------------------"<<endl;
//下右上左
int len=1;
if(loop==1)len = loop;
else{
for(int i=0;i<loop-1;i++){
len+=2;
}
}
for(int i=0;i<len;i++){
indexR++;num++;
matrix[indexR][idnexC] = num;
//PrintM(matrix,di);
if(num==targetNum)return;
}
for(int i=0;i<len;i++){
idnexC++;num++;
matrix[indexR][idnexC] = num;
//PrintM(matrix,di);
if(num==targetNum)return;
}
//-----------
len++;
for(int i=0;i<len;i++){
indexR--;num++;
matrix[indexR][idnexC] = num;
//PrintM(matrix,di);
if(num==targetNum)return;
}
for(int i=0;i<len;i++){
idnexC--;num++;
matrix[indexR][idnexC] = num;
//PrintM(matrix,di);
if(num==targetNum)return;
}
loop++;
}
int main(){
while(cin>>targetNum){
int di=1;
for(int i=2;;i++){
if(i*i >= targetNum){
di = i;break;
}
}
vector<vector<int>> matrix(di,vector<int>(di,0));
int indexR,idnexC;
if(di%2==1){
indexR=di/2;idnexC=di/2;
}
else {
indexR=di/2-1;idnexC=di/2-1;
}
int num=1;
matrix[indexR][idnexC] = 1;
//下右上左
int loop=1;
while(num<targetNum){
Create(matrix,indexR,idnexC,di,num,loop);
}
//输出方式
//PrintM(matrix,di);
//检查列,跳过整列为0的列
int SkipCol=-1;
for(int i=0;i<di;i++){
int currentcolIsSkip=1;
for(int j=0;j<di;j++){
if(matrix[j][i]!=0)currentcolIsSkip=0;
}
if(currentcolIsSkip)SkipCol=i;
}
for(int i=0;i<di;i++){
for(int j=0;j<di;j++){
if(j!=SkipCol&&matrix[i][j] != 0)cout<<matrix[i][j];
else if(j==SkipCol)continue;
else cout<<' ';
if(matrix[i][j] != targetNum)cout<<' ';
}
cout<<endl;
}
}
system("pause");
}
- 做了很久,不熟。多次尝试和画图后发现向下和右的位数分别为1、3、5,而上和左为2、4次。
题72:考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
- 动态规划思想:用一个多维数组记录该坐标含义下的最大值,比如无限背包中i个物品j个负重下的最大值,数字金字塔的是i行j列元素到达最底层的最大值。
- 函数形式:
- 辅助数组 dp
- 值类型 DP(参数){
- if(边界条件) 边界的返回值;
- if(辅助数组dp已有值可直接返回)
- 分支进入语句,return 记录值 = 所有分支中最大的一个}
- 使用DP函数时,为最初始的状态值。
cpp
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> dp;
vector<vector<int>> matrix;
int DPfunc(int row,int col,int edge){
if(row == edge) return matrix[row][col];
if(dp[row][col] !=-1)return dp[row][col];
dp[row][col] = matrix[row][col] +
max(DPfunc(row+1,col,edge),DPfunc(row+1,col+1,edge));
return dp[row][col];
}
int main(){
int di;cin>>di;
matrix = vector<vector<int>> (di,vector<int>(di,0));
dp = vector<vector<int>> (di,vector<int>(di,-1));
for(int i=0;i<di;i++){
for(int j=0;j<i+1;j++){
cin>>matrix[i][j];
}
}
//------------
int ans = DPfunc(0,0,di-1);
cout<<ans<<endl;
system("pause");
}
题76:给你一张5行5列的效益表,表中的数字均为大于等于0的整数,要求在这张表中选出5个不同行不同列的数字,使这5个数字的和最大。
- 类似于八皇后的DFS问题。与动态规划很像却又不同,首先它不需要辅助数组和return记录当前分支路口中最大的值,它直接传递每个分支的值,在边界处进行比较和更新即可。
- 函数形式:
- void DFS(int sum,参数){
- if(边界或越界后处理)ans =max(ans,sum); return;
- 进入分支语句
- new参数,DFS(sum+本分支的值,new参数)
- return;}
- 注意要new参数,否则修改的是本层参数,后续分支用不了该分支对应参数。
Reinforcement learning is a machine learning approach that learns optimal strategies through interaction with the environment. In the reinforcement learning framework, an agent observes the state of the environment and takes corresponding actions in order to receive rewards or penalties. The goal of the agent is to find a policy that maximizes long-term cumulative rewards through continuous exploration and learning. Unlike supervised learning, reinforcement learning usually does not rely on large amounts of labeled data but improves decision-making ability through trial and error. Reinforcement learning has achieved success in many complex tasks such as robotic control, autonomous driving, and game artificial intelligence. In the famous Go program AlphaGo, reinforcement learning was combined with deep neural networks, enabling computers to reach or even surpass the level of top human players. However, in practical applications, reinforcement learning still faces challenges such as low sample efficiency and high training costs.
- 强化学习是通过和环境互动来学习最优策略的机器学习方法。在强化学习框架中,智能体观察环境的状态并采取相关的行动来获得强力或惩罚。智能体的目标是通过持续的探索和学习来找到一个策略能够最大化长期的累积奖励。不同于监督学习,强化学习通常不依赖于大量的带标签的数据,而是通过试验和错误来提高决策能力。强化学习已经在许多的复杂任务中取得了成功,例如机器人控制、自动驾驶和游戏人工智能。在最著名的Go程序AlphaGo中,强化学习结合深度神经网络,使得计算机达到了甚至超越了顶尖人类选手的水平。然而,在实际应用中,强化学习仍然面临挑战,例如低样本效率和高额训练开销。