题目:
有时候程序员有很奇怪的方法来隐藏他们的口令。
Billy"Hacker"Geits会选择一个字符串S(由L个小写字母组成,5<=L<=100,000),然后他把S顺时针绕成一个圈。
如字符串cbadfa,绕成一个圈后,我们认为字符串首尾相连。
每次取其中一个字母作为起始字母,并顺时针依次取字母而组成一个字符串。这样将得到一些字符串。
比如字符串cbadfa,按照以上规则取出的字符串有:
cbadfa badfac adfacb dfacba facbad acbadf
我们找到最小的那个字符串,可知为acbadf,也可知道它的第一个字符'a'在原字符串cbadfa中为第6个字符(位置从1开始),
将得到的结果6减1得到5,这就是我们需要的口令。
再比如字符串alabala,绕成一个圈后,每次取其中一个字母作为起始字母,并顺时针依次取字母而组成一个字符串。这样将得到一些字符串:
alabala labalaa abalaal balaala alaalab laalaba aalabal
我们找到最小的那个字符串,可知为aalabal,它的第一个字母'a'在原字符串中位置为7,7-1=6,则6为口令。
注:如果按照规则有两个字符串都是最小的,则取前面那一个。
要点总结:
用嵌套循环进行遍历,外层控制开始下标,内层控制取数几次,遍历中去更新全局变量。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int l;
cin>>l;
string s="";
char c;
while(cin>>c){
if(c=='\n'){
continue;
}
s=s+c;
}
string mins=s;
int minidx=0;
for(int i=0;i<l;i++){
string res="";
int curidx=i;
for(int j=0;j<l;j++){
res=res+s[curidx];
curidx=(curidx+1)%l;
}
if(res<mins){
mins=res;
minidx=i;
}
}
cout<<minidx;
return 0;
}
题目:
在程序设计中,对字符串的处理是经常遇到的一个问题。
例如,将字符串中所有的英文字母变成大写,或者将一个字符串与另一个字符串连接构成一个新的字符串。
由于此类的操作非常普遍,因此,在设计程序语言的时候,设计者就已经把这类操作的代码写好了,如果编程人员要使用这些代码,只需把该类代码的头文件包含到自己的程序中,编程人员就可以很简单的调用,这样使编程节省了不少时间。
明明是一名项目经理,他现在负责一种新的程序设计语言的开发,现在需要预先实现大量的和处理字符串有关的功能方法,以后这些方法会包含到程序设计语言中,方便程序语言使用者的开发。你是明明手下的一名软件工程师,明明分配给你一个任务,在两个字符串中,找到一个字符串在另一个字符串中的起始位置。 例如,有两个字符串,一个字符串s= "abc",另一个字符串subs="bc",现在就要找出"bc"在"abc"中的其实位置,在这个例子中,"bc"的起始位置为2。
明明的问题可以归结为:输入两串字符串s和subs,求s中subs的起始位置。
要点总结:
长度不长情况下直接朴素模式匹配即可,不用KMP,注意是s[i+j]!=sub[j],sub里面别粗心写错了
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s,sub;
while(cin>>s>>sub){
bool flag=false;
for(int i=0;i<=s.size()-sub.size();i++){
bool canfind=true;
for(int j=0;j<sub.size();j++){
if(s[i+j]!=sub[j]){
canfind=false;
break;
}
}
if(canfind){
cout<<i+1<<endl;
flag=true;
break;
}
}
if(!flag){
cout<<0<<endl;
}
}
return 0;
}
题目:
以字符串形式输入仅有整数和加减(正负)号构成的表达式,输出该表达式的值。
要点总结:
这题比较巧妙的地方是在最前面添加一个加号,这样每次读char类型和int类型,int类型是可以读入负数的
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
int res=0;
stringstream ss("+"+s);
int n;
char fuhao;
while(ss>>fuhao>>n){
if(fuhao=='+'){
res+=n;
}else{
res-=n;
}
}
cout<<res<<endl;
}
return 0;
}
题目:
明明读小学的时候,不喜欢数学,尤其是不喜欢做加法,一做加法就头疼,这样导致明明长大后数学依然不好,而且对数字产生了抵触心理。可是不巧的是,明明进了一家会计公司,每天都要计算很多数据,在这些计算中加法运算居多,而且这些加法不只是是两个数之间的加法,更有多个数的连加。 例如:1+2+3的正确答案是6。 这给明明造成了很大的麻烦。你是明明的好朋友,看到明明如此痛苦,就产生了帮助明明的想法。你想帮明明写一个程序,这个程序能计算一串正整数的连加,从而帮助明明摆脱数字的困扰。 明明的问题可以归结为:给你一串正整数的连加表达式,完成这个表达式的计算。
要点总结:
此题注意一下语法,getline(ss,c,'+')这里c必须是string类型,别写成char类型了
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
while(cin>>s){
stringstream ss(s);
string a;
int res=0;
while(getline(ss,a,'+')){
res+=stoi(a);
}
cout<<res<<endl;
}
return 0;
}
题目:
序列是在数学世界中一种非常有趣的数字现象,它通过某一规则来产生数字,使数字变得有趣、变幻无穷。很多数学家对序列这种事物产生了浓厚的兴趣,花了很多时间对其进行研究,明明就是其中的一位。一天,他又在研究一种新的序列产生规则,该序列的规则如下:
1) 第1轮,写出两个1,即11;
2) 第2轮,在它们中间插入2,成为121;
3) 第3轮,在上面数中每两个相邻的和为3的数之间插入3,成为13231;
4) 以此类推下去,第n轮,在第n-1轮的数字的基础上,每两个相邻的和为n的数之间插入n。
明明根据这个规则开始构造序列。开始还觉得容易,但是越到后面,明明发现构造序列的计算量越来越大,计算难度也越来越高,计算速度也越来越慢。于是,明明就求助于你这位程序设计专家,能否帮他写一个程序,构造出序列的前9项,然后当明明需要知道序列中的哪一项的时,你就把那一项的数字告诉明明。
明明的问题可以归结为:根据题目描述中所描述的序列产生规则构造序列的前9项,然后告诉你一个正整数n,要求你输出序列的第n项。
要点总结:
记得作参数的vector的变量也要加&,否则变化传不过去。另外记忆一些vector的插入方法,如果忘记了用devcpp打点insert可能会跳点提示。
代码:
#include<bits/stdc++.h>
using namespace std;
string genera(vector<int> &pre,int n){
for(int i=0;i<pre.size()-1;i++){
int cur=pre[i];
int next=pre[i+1];
if(cur+next==n){
pre.insert(pre.begin()+i+1,n);
i++;
}
}
string res="";
for(int i=0;i<pre.size();i++){
res=res+to_string(pre[i]);
}
return res;
}
int main(){
vector<string> res(10);
res[1]="11";
vector<int> pre(2);
pre[0]=1;
pre[1]=1;
for(int i=2;i<=9;i++){
string cur=genera(pre,i);
res[i]=cur;
}
int n;
while(cin>>n){
cout<<res[n]<<endl;
}
return 0;
}
题目:
0、1、2三个数字的全排列有六种,按照字母序排列如下:
012、021、102、120、201、210
输入一个数n
求0~9十个数的全排列中的第n个(第1个为0123456789)。
要点总结:
不用dfs,直接用next_permutation就好,会从小到大枚举所有组合。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int arr[]={0,1,2,3,4,5,6,7,8,9};
int num=0;
do{
num++;
if(num==n){
string res="";
for(int a : arr){
res=res+to_string(a);
}
cout<<res;
return 0;
}
}while(next_permutation(arr,arr+10));
return 0;
}
题目:
数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
要点总结:
这题要逆向思维,从目标vector往全是0努力,每次如果有奇数就减一,判断一下有没有全减为0,全是偶数后统一除以2,再看有没有到0,这样用的操作次数是最少的。
代码:
#include<bits/stdc++.h>
using namespace std;
bool all0(vector<int> arr){
for(int i=0;i<arr.size();i++){
if(arr[i]!=0){
return false;
}
}
return true;
}
int main(){
int n;
cin>>n;
vector<int> target(n);
for(int i=0;i<n;i++){
cin>>target[i];
}
int num=0;
while(true){
if(all0(target)){
break;
}
for(int i=0;i<target.size();i++){
if(target[i]%2==1){
target[i]--;
num++;
}
}
if(all0(target)){
break;
}
for(int i=0;i<target.size();i++){
target[i]/=2;
}
num++;
}
cout<<num;
return 0;
}
英语翻译:
冯诺依曼瓶颈因为将内存与处理器分离的架构限制了人工智能性能。模拟人工智能通过最直接在内存执行计算解决了这个问题。这种架构减少了数据的移动,降低了能源损耗并且加快了神经网络任务的处理速度。
农业领域的人工智能技术使用无人机和传感器来监控农作物的健康情况。计算机视觉技术可以识别除害虫和早期的农作物营养不足,预测性模型可以根据天气以及土壤数据预测农作物的产出。这些工具帮助农民优化资源的利用并且增加了农业生产力。
人工智能安全研究聚焦于防范非预期的有害结果。研究者开发了一致性技术来确保人工智能系统遵循人类的价值观。对于高风险的人工智能应用,严格的测试以及监控准则对于避免灾难性后果来说是必不可少的。
