题目:
据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去这些牛制造的奇观(最棒的回文)。在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'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;
}
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研究以及心理学、神经生理学、语言学之间也存在较强的纽带。人机交互的研究也和心理学有关联。机器人专家与机械工程师和生理学家合作设计新的机器人。
计算机科学几乎和所有使用计算机的知识领域都存在间接的关联。其他领域开发的应用通常涉及到和计算机科学家的合作,后者为他们提供算法、数据结构、软件工程、现存技术的知识。作为回报,计算机科学家得到了观察新奇的计算机应用的机会,进而对其使用有了更深的洞察。这些关联使得计算机科学成为一个高度跨学科的研究领域。
