题一:统一大小写
题解:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int t;
int main()
{
cin>>t;
while(t--)
{
string s;
cin>>s;
int l=0,r=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='a'&&s[i]<='z')l++;
else r++;
}
if(r>l)
{
for(int i=0;i<s.size();i++)
if(s[i]>='a'&&s[i]<='z')cout<<char(s[i]-32);
else cout<<s[i];
}
else
{
for(int i=0;i<s.size();i++)
if(s[i]>='a'&&s[i]<='z')cout<<s[i];
else cout<<char(s[i]+32);
}
cout<<endl;
}
}
题二:截断数组
题解
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int s[N];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &s[i]);
s[i] += s[i - 1];
}
if (s[n] % 3)
{
puts("0");
return 0;
}
LL res = 0;
for (int i = 3, cnt = 0; i <= n; i ++ )
{
if (s[i - 2] == s[n] / 3) cnt ++ ;
if (s[n] - s[i - 1] == s[n] / 3) res += cnt;
}
printf("%lld\n", res);
return 0;
}
题三:子序列
题解
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n,lmax[N],lmin[N],rmin[N],rmax[N];
int a[N];
//注意存的是下标
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ){
scanf("%d", &a[i]);
lmax[i]=lmin[i]=i;//初始化
if (i>=2){
if (a[lmax[i-1]]>a[i]) lmax[i]=lmax[i-1];
//若左边有比a[i]大的则更新为该数下标
if (a[lmin[i-1]]<a[i]) lmin[i]=lmin[i-1];
//若左边有比a[i]小的则更新为该数下标
}
}
for (int i = n; i >=1 ; i -- ){
rmax[i]=rmin[i]=i;//初始化
if (i<=n-1){
if (a[rmax[i+1]]>a[i]) rmax[i]=rmax[i+1];
//若右边有比a[i]大的则更新为该数下标
if (a[rmin[i+1]]<a[i]) rmin[i]=rmin[i+1];
//若右边有比a[i]小的则更新为该数下标
}
}
for (int i=2;i<n;i++){
if (lmax[i]!=i&&rmax[i]!=i){//存在左右边都比中间大的情况(\/)
printf ("3\n%d %d %d\n",lmax[i],i,rmax[i]);
//当存在最短非有序子序列时 其最短的长度一定为3 注意输出下标
return 0;
}
if (lmin[i]!=i&&rmin[i]!=i){//存在左右边都比中间小的情况(/\)
printf ("3\n%d %d %d\n",lmin[i],i,rmin[i]);
return 0;
}
}
printf ("0\n");
return 0;
}