4212. 字符串比较
题目链接
解题思路
c++自带字符串比较(字典序),所以主要工作是把两个字符串的大小写统一
代码
#include<iostream> #include<cstring> using namespace std; string s1, s2; void change_s(string &s) { for(int i=0 ; i<s.length() ; i++) if(s[i]>='A' && s[i]<='Z') s[i] += 32; } int main() { cin >> s1 >> s2; change_s(s1); //转为小写 change_s(s2); if(s1<s2) cout << "-1"; else if(s1>s2) cout << "1"; else cout << "0"; return 0; }
特别注意
函数中要引入地址,这样才能在主程序中修改字符串
4213. 最小结果
题目链接
解题思路
由于符号数量较小,所以可以枚举每种符号的情况。
代码
#include <iostream> #include <cstring> using namespace std; int main() { int a[4]; char c[3]; unsigned long long res=0; for(int i=0 ; i<4 ; i++) cin >> a[i]; for(int i=0 ; i<3 ; i++) cin >> c[i]; sort(a, a+4); if( a[0]==0 && (c[0]=='*' || c[1]=='*' || c[2]=='*') ) { cout << "0"; return 0; } if(c[0]==c[1] && c[1]==c[2]) { if(c[0]=='*') { res = a[0]; res *= a[1]; res *= a[2]; res *= a[3]; cout << res; return 0; } if(c[0]=='+') { res = a[0]+a[1]+a[2]+a[3]; cout << res; return 0; } } if(c[0]=='*') { if(c[1]=='*') { if(c[2] == '+')//**+ { res = min(a[0]*a[1]*a[2]+a[3], a[0]*a[3]+a[2]*a[1]); cout << res; return 0; } } else if(c[1]=='+') { if(c[2]=='+')//*++ { res = a[0]*a[1]+a[2]+a[3]; cout << res; return 0; } else if(c[2]=='*')//*+* { res = min( ((a[0]*a[1])+a[3])*a[2], ((a[0]*a[1])+a[2])*a[3]); res = min(res, ((a[2]*a[1])+a[3])*a[0]); cout << res; return 0; } } } else if(c[0]=='+') { if(c[1]=='*') { if(c[2]=='*')//+** { res = min((a[0]+a[1])*a[2]*a[3], (a[2]+a[3])*a[0]*a[1]); cout << res; return 0; } else if(c[2]=='+')//+*+ { res = a[3]+a[2]+a[0]*a[1]; cout << res; return 0; } } else if(c[1]=='+') { if(c[2]=='*')//++* { res = a[3]+a[2]+a[1]; res *= a[0]; cout << res; } } } return 0; }
4214. 三元组
题目链接
解题思路
枚举中间指针 j ,然后分别在 j 的左右两边枚举 i 和 k , 寻找最小值
讲解视频
AcWing 4214. 三元组(AcWing杯 - 周赛) - AcWing
代码
#include<iostream> using namespace std; const int M = 3010, INF = 5e8; long long res = 0; long long s[M], c[M]; int main() { int n; cin >> n; for(int i=0 ; i<n ; i++) cin >> s[i]; for(int i=0 ; i<n ; i++) cin >> c[i]; long long res = INF; for(int j=0 ; j<n ; j++) { long long left = INF, right = INF; for(int i=0 ; i<j ; i++) if(s[i] < s[j]) left = min(left, c[i]); for(int k=j+1 ; k<n ; k++) if(s[j] < s[k]) right = min(right, c[k]); res = min(res, left+c[j]+right); } if(res == INF) res = -1; cout << res; return 0; }