目录
欢迎
1.劲舞团
#include <iostream>
using namespace std;
int main()
{
int num=1,M=0;
long long c[1000000];
int cnt=0;
string a,b ;
while(cin>>a>>b>>c[cnt++])//系统自动输入数据
{
if(cnt==1)
{
continue;
}
if(a==b && c[cnt-1]-c[cnt-2]<=1000)//敲击字符正确,并且两个打出的字符之间的时间小于1s
{
num++;
}
else
{
M=max(num,M);//找出最长的连击
num=1;
}
}
cout<<M;
return 0;
}
2.数字诗意
数字能够表示为连续正整数之和的条件是该数字不是2的幂
检查每个数字是否是 2 的幂
对于每个数字,小于3或者它是 2 的幂,则它不含有诗意,需要删除
#include <iostream>
using namespace std;
bool a(long long s)
{
if(s<=0) return false;
while(s%2==0)
{
s/=2;
}
return s==1;//除到最后结果不为1就不是2的幂次方
}
int main()
{
// 请在此输入您的代码
long long n=0,m=0;
cin>>n;
int count=0;
for(int j=0;j<n;j++)
{
cin>>m;
if( m<3 || a(m) )
{
count++;
}
}
cout<<count;
return 0;
}
3.封闭图形个数
ret函数:利用switch记录每个数字可以组成多少个封闭图形
a函数对应题目的意思确定排序规则:
- 第一优先级:封闭图形的个数。
- 第二优先级:数字的数值。
通过自定义函数来排序好
#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int ret(char s)
{
switch (s)
{
case '0':return 1;
case '4':return 1;
case '6':return 1;
case '9':return 1;
case '8':return 2;
default:return 0;
}
}
bool a(const std::string& a, const std::string& b)
{
int countA=0, countB=0;
for (char ch : a)
{
countA += ret(ch);
}
for (char ch : b)
{
countB += ret(ch);
}
if (countA != countB)
{
return countA < countB;
}
return std::stoi(a) < std::stoi(b);//stoi函数:把字符转化成整数
}
int main()
{
int n = 0;
std::cin >> n;
std::vector<std::string> nums(n);
for (int i = 0; i < n; i++)
{
std::cin >> nums[i];
}
std::sort(nums.begin(), nums.end(), a);
for(const string& ch:nums)
{
cout<<ch<<" ";
}
return 0;
}
4.回文数组
需要将数组的每一对 (a[i],a[n−i−1])(a[i],a[n−i−1]) 调整成相等,就是回文
对于每一对 a[i]a[i] 和 a[n−i−1]a[n−i−1],我们可以通过调整它们的值使它们相等。
每次调整的代价就是这两个数之间的绝对差值,即 ∣a[i]−a[n−i−1]∣∣a[i]−a[n−i−1]∣。
将所有不等的数对调整到相等时,最小的操作次数就是每一对的差值的总和。
#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
long long a[N], b[N], sum = 0;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i]; // 逐个读取a数组的值,数组下标从1开始
}
// 对数组b进行赋值,数组b的前半部分是a数组的倒序差值
for (int i = 1; i <= n / 2; i++) {
b[i] = a[n - i + 1] - a[i]; // b[i]为a数组倒数第i个元素减去第i个元素的差
}
// 遍历b数组的前半部分,计算sum并做进一步处理
for (int i = 1; i <= n / 2; i++) {
sum += abs(b[i]); // 将b[i]的绝对值累加到sum中
// 如果b[i]和b[i+1]符号相同(即b[i] * b[i+1] > 0),则进行合并操作
if (b[i] * b[i + 1] > 0) {
// 如果b[i+1]的绝对值大于b[i],则b[i+1]减去b[i]
if (abs(b[i + 1]) > abs(b[i])) {
b[i + 1] -= b[i]; // 合并两个值
} else {
i++; // 如果b[i]的绝对值较大,则跳过下一个元素,i自增
}
}
}
cout << sum;
return 0;
}
本道题中的'合并操作'解析:
因为一次操作可以指定相邻的两个数,同时加1或减1
分为两种情况
1. 同号:b[i+1]需减去b[i]的操作数,再加到sum中
2.异号:只需将b[i]的绝对值全部加到sum中
谢谢