3.17二刷基础112 118 完成进阶52

题目:

给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。

你能求出数列中总共有多少个K倍区间吗?

要点总结:

这里不要使用掩码的方式进行遍历,那样得到的是所有非空子集,这里要求连续。同时,这里数字比较大,如果暴力枚举所有开始下标和结束下标会超时。应该用一个unordered_map来存储对于k的余数,以及该余数出现的次数,初始余数0出现一次。用一个全局变量记录所有前置元素的和,遍历所有元素,每次前置元素和加上目前元素就对k取余,如果之前有相同的元素,有几个就加几个区间,因为那几个元素到这个元素的和一定为k的倍数,然后记录一下这个余数的value+1.

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int n,k;

cin>>n>>k;

vector<int> arr(n);

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

cin>>arr[i];

}

int count=0;

unordered_map<int,int> m;

m[0]=1;

int presum=0;

for(int a : arr){

presum=(presum+a)%k;

count+=m[presum];

m[presum]++;

}

cout<<count;

return 0;

}

题目:

密码分析学中常常需要统计字符出现的频度。给定若干行短文,要求按字符出现的频度由高到低输出,当两个字符出现的频度相同时,按字符大小的顺序输出。

注意:只需要统计英文字母的频度,非英文字母一律忽略。

要点总结:

这里要记住,遍历vector里面自己定义的结构体的时候,记得加&,否则改不到里面的值。

代码:

#include<bits/stdc++.h>

using namespace std;

struct fen{

char let;

int time;

};

bool compa(fen a,fen b){

if(a.time!=b.time){

return a.time>b.time;

}

return a.let<b.let;

};

int main(){

string s1;

bool first=true;

while(getline(cin,s1)){

string s="";

for(char c : s1){

if(!isalpha(c)) continue;

char d=toupper(c);

s=s+d;

}

vector<fen> arr;

for(char c : s){

bool flag=false;

for(fen &x : arr){

if(x.let==c){

x.time++;

flag=true;

}

}

if(!flag){

fen y;

y.time=1;

y.let=c;

arr.push_back(y);

}

}

sort(arr.begin(),arr.end(),compa);

if(first){

first=false;

}else{

cout<<endl;

}

for(fen x : arr){

cout<<x.let<<" "<<x.time<<endl;

}

}

return 0;

}

题目:

在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z 。为了吸引更多的顾客,商店举行了促销活动。

促销活动把一个或多个商品组合起来降价销售,例如: 三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是 12z。

编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。

尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。

对于上面的商品信息,购买三朵花和两个花瓶的最少花费是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)

要点总结:

用多个结构体以及map封装信息,采用dfs,每次传入剩余要买的东西以及目前的花费,计算直接购买的钱加上花费来更新全局变量,下面再去递归查看所有可能用到的折扣。

代码:

#include<bits/stdc++.h>

using namespace std;

struct discount{

map<int,int> goods;

int price;

};

vector<discount>dis;

map<int,int> need;

map<int,int> oriprice;

int mincos=INT_MAX;

int calcostori(map<int,int> need){

int total=0;

for(auto p : need){

total+=(p.second*oriprice[p.first]);

}

return total;

}

void dfs(map<int,int> need,int curcos){

int total=curcos+calcostori(need);

if(total<mincos) mincos=total;

for(auto d : dis){

map<int,int> tempneed=need;

bool canuse=true;

for(auto g : d.goods){

int kind=g.first;

int num=g.second;

if(tempneed.find(kind)==tempneed.end()||tempneed[kind]<num){

canuse=false;

break;

}

}

if(canuse){

for(auto g : d.goods){

int kind=g.first;

int num=g.second;

tempneed[kind]-=num;

if(tempneed[kind]==0){

tempneed.erase(kind);

}

}

dfs(tempneed,curcos+d.price);

}

}

}

int main(){

int s;

cin>>s;

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

discount m;

int n,c,k;

cin>>n;

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

cin>>c>>k;

m.goods[c]=k;

}

cin>>m.price;

dis.push_back(m);

}

int b;

cin>>b;

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

int c,k,p;

cin>>c>>k>>p;

need[c]=k;

oriprice[c]=p;

}

dfs(need,0);

cout<<mincos;

return 0;

}

英语翻译:

人工智能驱动的机器人通过执行重复精准的任务对制造业起到了很大帮助。这些机器人和人类工人协同作业,提升了生产效率也减少了工伤事故。先进的模型使用计算机视觉技术来灵活适配不同产量规格。

大型基础模型会在大规模数据集上进行预训练,使其能胜任多种应用场景。为特定任务微调这些模型可以缩短开发时间。然而,这些模型极高的计算要求对于小型研究团队以及初创公司都是一种限制。

心理健康领域的人工智能技术使用聊天机器人来提供情绪支持并且检查心理健康问题。自然语言处理技术通过分析用户的文本来检测其情绪上的痛苦。这些技术补充了专业服务的不足,尤其在缺乏心理健康资源的地区。

相关推荐
美式请加冰2 小时前
链表的介绍和使用
数据结构·链表
旖-旎2 小时前
二分查找(1)
c++·算法·二分查找·力扣·双指针
困死,根本不会2 小时前
【C 语言】指针学习笔记:从底层原理到实战应用
c语言·开发语言·笔记·学习·算法
小范自学编程2 小时前
算法训练营 Day38 - 动态规划part07
算法·动态规划
星空露珠3 小时前
迷你世界UGC3.0脚本Wiki全局函数
开发语言·数据库·算法·游戏·lua
小王不爱笑1323 小时前
排序算法 Java
数据结构·算法·排序算法
无敌憨憨大王3 小时前
二叉树的最短路径长度(BFS+DFS)
算法·深度优先·宽度优先
tankeven3 小时前
HJ132 小红走网格
c++·算法
小璐资源网3 小时前
算法黑箱的可解释性危机
算法