ACwing 第 35 场周赛

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循环,不拘小节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值