小明的老师准备组织一次班级活动。班上一共有 nn 名 (nn 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 nn 以内的正整数作为 idid,第 ii 名同学的 idid 为 aiai。
老师希望通过更改若干名同学的 idid 使得对于任意一名同学 ii,有且仅有另一名同学 jj 的 idid 与其相同 (ai=ajai=aj)。请问老师最少需要更改多少名同学的 idid?
输入共 22 行。
第一行为一个正整数 nn。
第二行为 nn 个由空格隔开的整数 a1,a2,...,ana1,a2,...,an。
输出共 11 行,一个整数。
1.桶计数,计算每个ID的出现次数。
2.遍历桶,记录出现频率大于2的ID个数和,记录等于1的ID个数和
3.如果sum1<=sum_n,sum=sum_n;反之,sum=sum_n+(sum0-sum_n)/2
#include
using namespace std;
int id[100010];
int ans,bns,sum;
int main()
{
int n;
cin >> n;
for(int i=1; i<=n; i++)
{
int ID;
cin >> ID;
id[ID]++;
}
for(int i=1; i<=n; i++)
{
if(id[i]>2) ans += id[i]-2;
if(id[i]==1) bns++;
}
if(ans>=bns) sum = ans;
else sum = ans + (bns-ans)/2;
cout << sum;
return 0;
}
如果某个ID的出现次数大于2次,大于2次的部分都要更改。
小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 SS,小蓝可以往字符串 SS 的开头处加入任意数目个指定字符: l、q、bl、q、b(ASCIIASCII 码分别为: 108、113、98108、113、98)。小蓝想要知道他是否能通过这种方式把字符串 SS 转化为一个回文字符串。
输入的第一行包含一个整数 TT,表示每次输入包含 TT 组数据。
接下来依次描述 TT 组数据。
每组数据一行包含一个字符串 SS 。
输出 TT 行,每行包含一个字符串,依次表示每组数据的答案。如果可以将 SS 转化为一个回文字符串输出 Yes
,否则输出 No
。
3
gmgqlq
pdlbll
aaa
Yes
No
Yes
对于 gmgqlq,可以在前面加上 qlq→qlqgmgqlq转化为一个回文字符串;
对于 pdlbll,无法转化为一个回文字符串;
对于 aaa,本身就是一个回文字符串。
1.双指针,找到非l、q、b的字符并记录位置j, i
2.如果没有非输入字符,输出Yes
3.以j、i位分界点内扩判断是否对称,外扩左边部分判断是否对称
#include
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--){
string s;
cin >> s;
int l = s.length();
int i=l-1,j=0;
while(i>=0&&(s[j] != 'l'&& s[j]!='q' && s[j]!='b')){
i--;
}
while(j=l){
cout << "Yes" << endl;
continue;
}else{
if(i>j){
for( ; i>j; )
{
if(s[i]==s[j]){
i--;
j++;
}else{
flag = false;
cout << "No" << endl;
break;
}
}//小对称
}
if(flag==false) continue;
if(n+1>l-m+1){
cout << "No" << endl;
continue;
}else{
for(int u=n-1; u>=0; u--)
{
if(s[u]==s[m+1]) m++;
else{
flag=false;
break;
}
}
}
if(flag==false)
cout << "No" << endl;
else
cout << "Yes" << endl;
continue;
}
}
return 0;
}
输出i,j进行调试。
小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的
范围之内。数组中的元素从左至右如下所示:
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2
7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1
0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3
现在他想要从这个数组中寻找一些满足以下条件的子序列:
1. 子序列的长度为 8;
2. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且
要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。
yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只
有一位时需要一个前导零补充。
请你帮小蓝计算下按上述条件一共能找到多少个不同 的 2023 年的日期。
对于相同的日期你只需要统计一次即可。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
1.枚举2023年的每一天yyyymmdd
2.在100个字符里搜索是否有对应的yyyymmdd
3.统计次数
#include
using namespace std;
int main(){
int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int num[100];
int ans=0;
for(int i=0; i<100; i++) scanf("%d", &num[i]);
for(int i=1; i<=12; i++) {
for(int j=1; j<=months[i]; j++)
{
string s = "2023";
if(i<10) s += '0'; //0-9数值转字符可以用加号
s += to_string(i); //to_string()函数
if(j<10) s += '0';
s += to_string(j);
cout << s << endl;
int k=0;
for(int idx=0; idx<100&&k<8; idx++)
{
if(num[idx] == s[k]-'0') k++; //0-9字符转数值可以用减号
}
if(k>=8) ans++;
}
}
cout << ans;
return 0;
}
字符串转数值(多字符):
std::stol()
(转 long)std::stod()
(转 double)std::stof()
(转 float)数值转字符串(多字符):
std::to_string()
字符与数值的转化(仅限0-9):加减‘0’