1.签到题目
给定两个长度相等的由大小写英文字母构成的字符串 A 和 B。
请你按照字典顺序对这两个字符串进行比较。
注意,在进行比较时,字母的大小写无关紧要,即大写字母被认为等同于相应的小写字母。
输入格式
第一行,字符串 A。
第二行,字符串 B。
输出格式
如果 A>B,则输出 1,如果 A<B,则输出 −1,如果 A=B,则输出 0。
数据范围
所有测试点满足,1≤|A|,|B|≤100。
#include<bits/stdc++.h>
using namespace std;
string a,b;
int main(){
cin>>a>>b;
int judge=0;
for(int i=0;i<a.size();i++){
if('a'<=a[i] && a[i]<='z'){
a[i]-=32;
}
if('a'<=b[i] && b[i]<='z'){
b[i]-=32;
}
if(a[i]>b[i]){
judge=1;
break;
}else if(a[i]<b[i]){
judge=-1;
break;
}
}
cout<<judge;
return 0;
}
2. AcWing 4213. 最小结果
有四个整数 a,b,c,d。
有三个操作符 op1,op2,op3,每个操作符要么是 *(表示乘法),要么是 +(表示加法)。
现在,我们要进行如下操作:
从现有整数中选出两个,按 op1 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们还剩下三个整数。
从现有整数中选出两个,按 op2 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们还剩下两个整数。
从现有整数中选出两个,按 op3 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们只剩下一个整数。
我们希望,最后剩下的一个整数尽可能小。
输入格式
第一行包含四个整数 a,b,c,d。
第二行包含三个操作符 op1,op2,op3,每个操作符要么是 *,要么是 +。
输出格式
输出最后剩下的一个整数的最小可能值。
数据范围
所有测试点满足 0≤a,b,c,d≤1000。
输入样例1:
1 1 1 1
+ + *
输出样例1
3
输入样例2
2 2 2 2
* * +
输出样例2
8
输入样例3
1 2 3 4
* + +
输出样例3
9
未通过代码
#include<bits/stdc++.h>
using namespace std;
int j_num,c_num;
vector<int> a;
int main(){
for(int i=0;i<4;i++){
int temp;
cin>>temp;
a.push_back(temp);
}
for(int i=0;i<3;i++){
string temp;
cin>>temp;
if(temp=="*")c_num++;
else j_num++;
}
sort(a.begin(),a.end());
int temp;
while(a.size()!=1){
if(c_num){
temp=a[0]*a[1];
c_num--;
}else if(j_num){
temp=a[0]+a[1];
j_num--;
}
//STL使用不熟练------------------------------------------------------------>在此注意sort内部的升降序 操作
//sort(a.begin(),a.end(),)
reverse(a.begin(),a.end());
for(int j=0;j<2;j++)a.pop_back();
// cout<<temp<<endl;
a.push_back(temp);
sort(a.begin(),a.end());
}
cout<<temp;
return 0;
}
通过代码(Y总思想)
```//DFS 写法
#include<bits/stdc++.h>
using namespace std;
//注意结果的可能取值是否会爆int的范围
#define LL long long
const LL INF=2e12+10;
//-----------------------------op数组开的大一点
char op[5];
LL min_value=INF;
vector<LL> num;
void dfs(vector<LL> v,int u){
if(v.size()==1){
min_value=min(min_value,v[0]);
return ;
}else{
for(int i=0;i<v.size();i++){
for(int j=i+1;j<v.size();j++){
vector<LL>t;
for(int q=0;q<v.size();q++){
if(q!=i && q!=j)t.push_back(v[q]);
}
if(op[u]=='*'){
t.push_back(v[i]*v[j]);
}else{
t.push_back(v[i]+v[j]);
}
// for(int i=0;i<t.size();i++)cout<<t[i]<<" ";
//cout<<endl;
dfs(t,u+1);
//在此处不用进行恢复现场-----详情见手写笔记
}
}
}
}
int main(){
for(int i=0;i<4;i++){
int temp;
cin>>temp;
num.push_back(temp);
}
/*读入char类型数组时刻避免使用%c(读入不会跳过空格等),
以下可以替换
for(int i=0;i<3;i++)scanf("%s",&op[i]);
*/
for(int i=0;i<3;i++)cin>>op[i];
dfs(num,0);
cout<<min_value;
return 0;
}
时间复杂度分析
O(C(n^4))(C为常数)
错误原因分析
1.看错题意 op1,op2,op3 不可以交换位置
2.未真正理解题意
4214. 三元组
给定两个长度为 n 的整数序列 s1,s2,…,sn 和 c1,c2,…,cn。
请你找到一个三元组 (i,j,k),满足以下所有条件:
i<j<k
si<sj<sk
ci+cj+ck 尽可能小
输出 ci+cj+ck 的最小可能值。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 s1,s2,…,sn。
第三行包含 n 个整数 c1,c2,…,cn。
输出格式
如果满足条件的三元组不存在,则输出 −1。
否则,输出 ci+cj+ck 的最小可能值。
数据范围
前 5 个测试点满足 3≤n≤10。
所有测试点满足 3≤n≤3000,1≤si≤109,1≤ci≤108。
错误代码1(考场上代码)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3010;
const int INF = 2e8;
int s[N],c[N];
int n;
int main(){
cin>>n;
int min_=INF;
for(int i=0;i<n;i++)cin>>s[i];
for(int i=0;i<n;i++)cin>>c[i];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
for(int r=j+1;r<n;r++){
int temp=c[i]+c[j]+c[r];
if(temp<min_ && s[i]<s[j] && s[j]<s[r]){
min_=temp;
}
}
}
}
if(min_=INF)cout<<-1;
else cout<<min_;
return 0;
}
错误代码2
找不到了。。。。。。。具体就是
可以遍历出结果且不超出时间复杂度的情况下,
使用多个数组储存过程中出现问题(代码功底差)
核心代码(Y总思想)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
//.const 定义时刻注意 结果的可能取值范围是不是超出int的定义范围.
const int N = 3010,INF= 5e8;
int n;
int s[N],c[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)scanf("%d",&s[i]);
for(int i=0;i<n;i++)scanf("%d",&c[i]);
int res=INF;
for(int j=0;j<n;j++){
int left=INF;
for(int i=0;i<j;i++){
if(s[i]<s[j]){
left=min(left,c[i]);
}
}
int right=INF;
for(int q=j+1;q<n;q++){
if(s[j]<s[q]){
right=min(right,c[q]);
}
}
res=min(res,left+c[j]+right);
}
if(res==INF)cout<<"-1";
else cout<<res;
return 0;
}
时间复杂度分析
O(n^2)
反思
1.const 定义时刻注意 结果的可能取值范围是不是超出int的定义范围.
2.在读入字符类型变量时,不要使用scanf("%c")的操作
3.能不爆时间复杂度的前提下,放心大胆使用for循环,不拘小节