2.15完成105、106、110

题目:

据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去这些牛制造的奇观(最棒的回文)。在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。

输出的第一行应该包括找到的最长的回文的长度。

下一个行或几行应该包括这个回文的原文(没有除去标点符号、空格), 把这个回文输出到一行或多行(如果回文中包括换行符)。如果有多个回文长度都等于最大值,输出那个前出现的。

要点总结:

难点在于输出时候要保留原文的标点符号以及空格,然而判断回文时又要去掉标点和空格。这里就要使用一个坐标vector去保存每个判断回文的坐标对应的原来字符串的坐标。遍历原来的字符串,用isalpha()方法判断是不是字母,如果是字母就放入新串,并且将在原串中的索引压入pos里面。后面得到最大回文数的起始和结束索引(在新串中的)后再根据这个索引去pos里面找到原串的索引,就可以拿到带标点和字符的了。

另外注意题目里面回文不关心大小写,所以判断回文的方法里面同意tolower()

还要,读的时候要把换行符也读入,这样子输出时候原来有换行符才能输出,不然报PE

while(getline(cin,s)){

ori=ori+s+"\n";

}

代码:

#include<bits/stdc++.h>

using namespace std;

bool ishui(string s){

string s1=s;

reverse(s1.begin(),s1.end());

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

if(tolower(s[i])!=tolower(s1[i])){

return false;

}

}

return true;

}

int main(){

string s;

string ori="";

while(getline(cin,s)){

ori=ori+s+"\n";

}

string fina="";

vector<int> pos;

for(int i=0;i<ori.size();i++){

if(isalpha(ori[i])){

fina+=ori[i];

pos.push_back(i);

}

}

int num=0;

int start=0,end=0;

for(int i=0;i<=fina.size()-1;i++){

for(int j=1;j<=fina.size()-i-1;j++){

string temp="";

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

temp+=fina[m];

}

if(ishui(temp)){

if(temp.size()>num){

num=temp.size();

start=i;

end=i+j;

}

}

}

}

string res=ori.substr(pos[start],pos[end]-pos[start]+1);

cout<<num<<endl<<res;

return 0;

}

题目:

I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.

要点总结:

数字过大,显然不能转整形再直接相加。要手动模拟加法竖式,从最后一位开始处理,每次算这位的值以及进位数,全处理完再reverse一下。标志位的flag不要脑抽写if(true)了,记得if(flag)

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int num;

cin>>num;

bool flag=false;

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

string s1,s2;

string res="";

cin>>s1>>s2;

int m=s1.size()-1,n=s2.size()-1,jinw=0;

while(m>=0||n>=0||jinw>0){

int a=(m>=0) ? s1[m]-'0' : 0;

int b=(n>=0) ? s2[n]-'0' : 0;

int sum=a+b+jinw;

jinw=sum/10;

int cur=sum%10;

res+=(cur+'0');

m--;

n--;

}

reverse(res.begin(),res.end());

if(flag){

cout<<endl;

}else{

flag=true;

}

cout<<"Case "<<(i+1)<<":"<<endl<<s1<<" + "<<s2<<" = "<<res<<endl;

}

return 0;

}

题目:

C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?

我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题"AC"后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。

例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次(如果b为0则没有括号及b),因此对于下述输入数据:

若每次错误提交的罚分为20分,即每错误提交一次,在总耗时时增加20分钟,则其排名从高到低应该是这样的:

Josephus 5 376

John 4 284

Alice 4 352

Smith 3 167

Bob 2 325

Bush 0 0

要点总结:

按三个规则去排序的写法要记忆一下,定义一个stu结构体,里面有这三个要素,再定义一个比较方法,作为参数传到sort函数里面。题目里面统计时间和acc时候0以及负数可以直接continue,判断括号用一下find和substring去获取括号里和括号外的数字。

代码:

#include<bits/stdc++.h>

using namespace std;

struct student{

string name;

int acc;

int time;

};

bool comparestu(student a,student b){

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

return a.acc>b.acc;

}

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

return a.time<b.time;

}

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

return a.name<b.name;

}

}

bool wukuohao(string s){

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

if(!isdigit(s[i])) return false;

}

return true;

}

int main(){

int n,m;

cin>>n>>m;

string name;

vector<student> a;

while(cin>>name){

student stu;

stu.name=name;

stu.acc=0;

stu.time=0;

string cur;

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

cin>>cur;

if(cur=="0") continue;

if(cur[0]=='-') continue;

if(wukuohao(cur)){

stu.time+=stoi(cur);

stu.acc++;

}else{

int zkh=cur.find("(");

int ykh=cur.find(")");

string s1=cur.substr(0,zkh);

string s2=cur.substr(zkh+1,ykh);

stu.time+=stoi(s1);

stu.time+=(stoi(s2)*m);

stu.acc++;

}

}

a.push_back(stu);

}

sort(a.begin(),a.end(),comparestu);

for(student std : a){

cout<<left<<setw(10)<<std.name<<" "<<right<<setw(2)<<std.acc<<" "<<right<<setw(4)<<std.time<<endl;

}

return 0;

}

英语翻译:

理论计算机科学从数学和逻辑学中借鉴了大量方法。数值计算的研究与数值分析方面的数学研究有存在重叠。计算机体系结构师负责设计计算机回路的电气工程师密切合作。

除了这些历史上的关联,在AI研究以及心理学、神经生理学、语言学之间也存在较强的纽带。人机交互的研究也和心理学有关联。机器人专家与机械工程师和生理学家合作设计新的机器人。

计算机科学几乎和所有使用计算机的知识领域都存在间接的关联。其他领域开发的应用通常涉及到和计算机科学家的合作,后者为他们提供算法、数据结构、软件工程、现存技术的知识。作为回报,计算机科学家得到了观察新奇的计算机应用的机会,进而对其使用有了更深的洞察。这些关联使得计算机科学成为一个高度跨学科的研究领域。

相关推荐
Clarence Liu1 小时前
用大白话讲解人工智能(5) SVM支持向量机:找一条“最宽的分隔线“
人工智能·算法·支持向量机
不想看见4042 小时前
N-Queens -- 回溯法 -- 力扣101算法题解笔记
java·数据结构·算法
xuxianliang2 小时前
第152章 纲领的统一(悦儿)
算法·程序员创富
XLYcmy2 小时前
智能体大赛 技术架构 核心驱动层
人工智能·算法·机器学习·llm·prompt·agent·qwen
月挽清风2 小时前
代码随想录第39天:动态规划
算法·动态规划
靠沿2 小时前
【优选算法】专题三——二分查找算法
数据结构·算法
Tisfy2 小时前
LeetCode 3714.最长的平衡子串 II:前缀和(一二三分类)
算法·leetcode·前缀和·字符串·题解
小O的算法实验室2 小时前
2026年IEEE TASE SCI2区,基于熵引导局部规划的多无人机自适应协同探索方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
仰泳的熊猫2 小时前
题目1474:蓝桥杯基础练习VIP-阶乘计算
数据结构·c++·算法·蓝桥杯