1,比赛成就
14届蓝桥杯省赛获得一等奖
天梯赛177分获个人三等奖,团体省三等奖
2,本次比赛题解
1、题目名称:订班服
小A班级订班服了! 可是小A是个小糊涂鬼,整错了好多人的衣服的大小。 小A只能自己掏钱包来补钱了。 小A想知道自 己至少需要买多少件衣服。
解题思路:计算每个大小的却额即可
2、题目名称:异或和
小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题
代码如下:
int solution(int N){
int result=0;//统计异或和
for(int i=1;i<=N;i++){
result^=i;//^为异或
}
return result;
}
3、题目名称:零钱兑换
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给 定一个aim,代表要找的钱数,求组成aim的最少货币数。 如果无解,请返回-1. 数据范围:数组大小满足 0 <= n <=10000 , 数组中每个数字都满足 0 < val <=10000,0 <= aim <=100000 要求:时间复杂度 O(n×aim) ,空 间复杂度 O(aim)。
解题思路,采用动态规划计算到达aim的最低步数
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int steps[100010]={0},val[10000],n,aim;
void f(int cur,int p,int step){
if(step>=steps[cur]&&steps[cur]>0)return;//如果存在可行方案且不是当前最低步数,返回
steps[cur]=step;//记录最低步数
if(cur==aim)return;//到达目标值,返回
while(p>=0&&val[p]+cur>aim){
p--;
}
while(p>=0){
f(val[p]+cur,p,step+1);//进行下一次迭代
p--;
}
}
int main(){
string a;
cin>>a;
int ans=0;
bool is=0;
int l=a.length();
for(int i=1;i<l;i++){
if(a[i]==','){//","为分隔符
val[n]=ans;
ans=0;
n++;
}else if(a[i]==']'){//进入aim输入缓解
is=1;
}else if(is){
aim*=10;
aim+=a[i]-'0';
}else{
ans*=10;
ans+=a[i]-'0';
}
}
if(aim==0){//aim为0则步数为0
cout<<0;
return 0;
}
sort(val,val+n);//零钱大小排序,从最大的开始
for(int i=n-1;i>=0;i--){
if(val[i]<=aim){
f(val[i],i,1);//进行第一次迭代
}
}
if(steps[aim]==0)cout<<-1;//aim无方案输出-1
else cout<<steps[aim];
}
4、题目名称:小艺照镜子
已知字符串str。 输出字符串str中最长回文串的长度。
解题思路:
#include<iostream>
#include<string>
using namespace std;
int main(){
int m=1;
string str;
cin>>str;
int n=str.length();
for(int i=1;i<n-1;i++){//计算以第i为字符为对称轴最大对称长度,所有长度取最大值
for(int j=1;j<=i;j++){
if(str[i+j]!=str[i-j])break;
if(2*j+1>m)m=2*j+1;
}
}
for(int i=0;i<n-1;i++){//计算以第i,i+1为字符为对称轴最大对称长度,所有长度取最大值
for(int j=0;j<=i;j++){
if(str[i-j]!=str[i+j+1])break;
if(2*j+2>m)m=2*j+2;
}
}
cout<<m;
}
3,比赛日程
6.3进行ICPC省赛
6.10进行蓝桥杯国赛