2023年2月月赛
T1 格式改写
题目描述
给定一个仅由拉丁字符组成字符序列,需要改写一些字符的大小写,使得序列全部变成大写或全部变成小写,请统计最少修改多少个字符才能完成这项任务。
输入格式
一个字符序列:保证仅由拉丁字符构成
输出格式
单个整数:表示最少修改次数
数据范围
设输入的字符数量为 nn,则保证 1≤n≤100,000
样例数据
输入:
TheQuickBrownFoxJumpsOverTheLazyDog
输出:
9
说明:
将大写改小写
思路
统计字母大小写的个数
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
char c;
int smallletters = 0, largeletters = 0, ans = 0;
while (cin>>c){
if (c >= 'a' && c <= 'z')
smallletters++;
else if (c >= 'A' && c <= 'Z')
largeletters++;
}
if(smallletters>largeletters)
cout<<largeletters<<endl;
else
cout<<smallletters<<endl;
return 0;
}
倍数统计
题目描述
给定整数 a,b 与正整数 c,求出在 aa 到 bb 之间(包含 aa 与 bb)有多少整数是 cc 的倍数。
输入格式
第一行:两个整数 a 与 b;
第二行:单个正整数 c。
输出格式
单个整数:表示答案。
数据范围
−10 9≤a≤b≤109
1≤c≤109
样例数据
输入:
4 6
5
输出:
1
思路
分别枚举不同种的情况,共分5种。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
long long a,b,c,ans;
cin>>a>>b;
cin>>c;
if(a>0){
ans=b/c-((a-1)/c);
}
if(b<0){
ans=abs(a)/c-((abs(b)-1)/c);
}
if(a<0&&b>0){
ans=abs(a)/c+b/c+1;
}
if(a==0){
ans=b/c+1;
}
if(b==0){
ans=abs(a)/c+1;
}
cout<<ans<<endl;
return 0;
}
区间的并
题目描述
给定一个数轴上的 n 个闭区间,第 i 个闭区间的两端点为[a
i
_i
i,b
i
_i
i]
,它们的并集可以表示为若干不相交的闭区间,请按照左端点从小到大的顺序输出这些区间的并集。
输入格式
第一行:单个整数 n;
第二行到第 n+1 行:每行两个整数 a
i
_i
i
与 b
i
_i
i, 表示一个闭区间 [a
i
,
_i,
i,b
i
_i
i].
输出格式
若干行:表示输入区间的并集。每行两个整数,表示一个闭区间的两个端点,这些闭区间应该按照起点从小到大排序。
数据范围
对于 50% 的数据,1≤n≤104
样例数据
输入:
3
10 12
1 3
2 5
输出:
1 5
10 12
思路
为了防止两个区间合并,例如【1,2】与【3,4】
采用下标*2的方法
最后除以2.
代码
平分数字(一)
题目描述
给定 n 个整数:a 1 _1 1,a 2 _2 2,a n _n n
,请判能否将它们分成两个部分(不得丢弃任何数字),每部分的数字之和一样大。
输入格式
第一行:单个整数 n;
第二行:n 个整数,表示 a
1
_1
1,a
2
_2
2,a
n
_n
n
输出格式
若能否平分,输出 Matched,否则输出 No
数据范围
对于 50% 的数据,1≤n≤18;
对于 100% 的数据,1≤n≤24;
-10,000,000\leq a_i\leq 10,000,000−10,000,000≤a
i
≤10,000,000
样例数据
输入:
4
1 2 3 4
输出:
Matched
说明:
1 + 4 = 2 + 3
输入:
3
2 2 2
输出:
No
思路
搜索
代码
#include<bits/stdc++.h>
#define INF 999999999
#define N 100010
using namespace std;
int n;
long long sum,a[30];
bool flag=0;
int dfs(int t,long long result)
{
if(result == sum)
{
flag = 1; return 0;
}
if(t>n)
{
return 0;
}
dfs(t+1,result);
dfs(t+1,result+a[t]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
if(sum%2!=0)//sum%2==1
{
cout<<"No"<<endl;
return 0;
}
sum/=2;
dfs(1,0);
if(flag == 1)
{
cout<<"Matched"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}