3.20二刷基础121、127,完成进阶61、62

题目:

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

要点总结:

用next_permutation枚举所有可能的情况在vector里,这样枚举过后,a永远取前面几位,b取中间那几位,c取后面的,可以穷举到所有情况。之后再枚举a取几位(1-7)以及b、c的位数,对所有情况判断是否合法。这里记住算值的时候用int型去算,不要转了string拼起来再stoi,这样运行超时。

代码:

#include<bits/stdc++.h>

using namespace std;

int n;

int num=0;

void check(int arr[]){

for(int alen=1;alen<=7;alen++){

int a=0;

for(int i=0;i<alen;i++){

a=a*10+arr[i];

}

if(a>=n){

break;

}

for(int blen=1;blen<=8-alen;blen++){

int b=0;

for(int i=alen;i<alen+blen;i++){

b=b*10+arr[i];

}

int clen=9-alen-blen;

int c=0;

for(int i=alen+blen;i<=8;i++){

c=c*10+arr[i];

}

if(b%c==0&&a+b/c==n){

num++;

}

}

}

}

int main(){

cin>>n;

int arr[]={1,2,3,4,5,6,7,8,9};

do{

check(arr);

}while(next_permutation(arr,arr+9));

cout<<num;

return 0;

}

题目:

肖恩和帕特里克是兄弟,他们从他们的父母那里得到了很多糖果。每一块糖具有一个正整数的价值,孩子们希望分他们得到的糖果。首先,肖恩将这些糖果分成两堆,并选择一堆给帕特里克。然后,帕特里克将尝试计算每堆的价值,其中每堆的价值是那堆糖果价值的总和,如果他觉得没有平等的价值,他将开始哭了起来。

不幸的是,帕特里克太小了,所以不能正确的计算。他只会二进制无进位的加法。比如说,他想算12(二进制为1100)加5(二进制为101),他会把最右边的两位加法算正确,但是第三位会忘记进位。(即0+0=0,0+1=1,1+0=1,1+1=0)

因此,帕特里克算12加5的结果为9。下面几个是帕特里克算的结果:

5 + 4 = 1

7 + 9 = 14

50 + 10 = 56

题目:

肖恩数学很好,他想得到价值总和更高的糖果并且不让他的弟弟哭。如果可能,他会分成两个非空的糖果袋,让帕特里克认为,双方都有相同的值的糖果。给你每一袋糖果每一块糖果的价值,我们想知道是否可能让帕特里克相信他们得到糖果价值的总量是相同的。如果可能计算出肖恩能得到的最大的价值。

要点总结:

这里的关键在把不进位的二进制加法看出^操作,二者在数学上是等价的,对应位都是0或都是1则为0,一个 0一个1才就为1。另外 ,异或和为0等价于任意拆成两部分这两部分异或和相等,所以直接判断一下异或和是不是为0,不为0就分不了,为0的话把最小那个给傻的那个就可以。

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int t;

cin>>t;

for(int i=0;i<t;i++){

int n;

cin>>n;

vector<int> arr(n);

for(int j=0;j<n;j++){

cin>>arr[j];

}

int yihuo=0,actual=0,minnum=INT_MAX;

for(int j=0;j<n;j++){

yihuo^=arr[j];

actual+=arr[j];

if(arr[j]<minnum) minnum=arr[j];

}

if(yihuo!=0){

cout<<"NO"<<endl;

}else{

cout<<actual-minnum<<endl;

}

}

return 0;

}

题目:

有这样一种素数叫纯素数(YY出来的名字),当它是一个多位数的时候,你把它的末位去掉之后余下的数依然是一个素数。比如说2393,2393 本身是一个素数,它的末位去掉之后,余下的是239。239 是一个素数,它的末位去掉之后,余下的是23 。23是一个素数,它的末位去掉之后,余下的是2 。2依然还是一个素数。纯素数的长度叫做"维"。2393 是一个4维素数。3797也是一个4维素数。

要点总结:

使用DFS遍历,每次传入上一层确定的素数,直接遍历0-9加在后面,如果结果为素数就入当前层的结果,统计好之后再传到下一层。递归出口就是当前维度和目标维度相同,这时候把这时当前层的vector赋给全局变量即可。

代码:

#include<bits/stdc++.h>

using namespace std;

vector<int> res;

bool issu(int a){

if(a==2) return true;

if(a<2) return false;

if(a%2==0) return false;

for(int i=3;i*i<=a;i++){

if(a%i==0){

return false;

}

}

return true;

}

void dfs(vector<int> su,int curweidu,int tarweidu){

if(curweidu==tarweidu){

res=su;

return;

}

vector<int> cursu;

for(int a : su){

for(int next=1;next<=9;next+=2){

int b=a*10+next;

if(issu(b)){

cursu.push_back(b);

}

}

}

dfs(cursu,curweidu+1,tarweidu);

}

int main(){

int t;

cin>>t;

for(int i=0;i<t;i++){

int n;

cin>>n;

vector<int> su={2,3,5,7};

dfs(su,1,n);

for(int m : res){

cout<<m<<endl;

}

}

return 0;

}

题目:

如下图所示,3 x 3 的格子中填写了一些整数。

+--*--+--+

|10* 1|52|

+--****--+

|20|30* 1|

*******--+

| 1| 2| 3|

+--+--+--+

我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。

本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出 0。

要点总结:

采用DFS遍历,这里记住先输入的是列数不是行数,看清宽度。还有先判断越不越界再加值看符不符合要求,否则运行时出错。另外,for里面那个判断应该是continue,而不是return,否则一个方向越界了就不看其他合法方向了。

代码:

#include<bits/stdc++.h>

using namespace std;

vector<vector<bool>> flag;

vector<vector<int>> arr;

int m,n;

int mingezi=INT_MAX;

int dire[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

void dfs(int culnum,int tarnum,int x,int y,int gezi){

if(culnum==tarnum){

if(gezi<mingezi) mingezi=gezi;

return;

}

for(int i=0;i<4;i++){

int dx=dire[i][0];

int dy=dire[i][1];

int nextx=x+dx,nexty=y+dy;

if(nextx<0||nextx>=n||nexty<0||nexty>=m||flag[nextx][nexty]==true||culnum+arr[nextx][nexty]>tarnum){

continue;

}

flag[nextx][nexty]=true;

dfs(culnum+arr[nextx][nexty],tarnum,nextx,nexty,gezi+1);

flag[nextx][nexty]=false;

}

}

int main(){

cin>>m>>n;

arr.resize(n,vector<int>(m));

int total=0;

for(int i=0;i<n;i++){

for(int j=0;j<m;j++){

cin>>arr[i][j];

total+=arr[i][j];

}

}

if(total%2!=0){

cout<<0;

return 0;

}

int targ=total/2;

int cur=arr[0][0];

flag.resize(n,vector<bool>(m,false));

flag[0][0]=true;

dfs(cur,targ,0,0,1);

if(mingezi==INT_MAX){

cout<<0;

}else{

cout<<mingezi;

}

return 0;

}

英语翻译:

体育领域的人工智能技术可以通过分析运动员的表现数据来优化训练计划。计算机视觉技术可以追踪动作模式,预测模型可以预测受伤风险。这些工具帮助教练做出数据驱动的决策并且提升运动员的竞技表现。

例如GPT和DALL-E的生成式人工智能模型已经受到了广泛的关注,它们可以根据提示生成类人文本和高质量图片。尽管这些模型提供了创造性的可能,对于这些模型的安全保护措施也是必要的,以免有人错误使用这些模型生成有害人类的创作内容。

网络安全领域的人工智能技术可以实时检测并对威胁做出响应。机器学习模型识别表明为网络攻击的反常网络活动,这种主动防御的策略帮助企业防止数据泄露并且最小化安全事件造成的影响。

prompt提示

相关推荐
I_LPL1 小时前
day58 代码随想录算法训练营 图论专题11
数据结构·算法·图论
m0_730115111 小时前
C++中的命令模式实战
开发语言·c++·算法
小比特_蓝光1 小时前
算法篇1-----双指针
数据结构·算法
lihao lihao2 小时前
二分查找
java·数据结构·算法
WolfGang0073212 小时前
代码随想录算法训练营 Day15 | 二叉树 part05
数据结构·算法
代码栈上的思考2 小时前
消息队列持久化:文件存储设计与实现全解析
java·前端·算法
qq_417695052 小时前
内存对齐与缓存友好设计
开发语言·c++·算法
2301_816651222 小时前
实时系统下的C++编程
开发语言·c++·算法
2401_831824962 小时前
C++与Python混合编程实战
开发语言·c++·算法