前言:
好久没写了,最近训练也很不在状态,想调整一下好好准备比赛啊,开始补题做记录,以后方便复习,也是自我监督。
0327校队蓝桥杯积分训练赛补题记录
A:
思路:
1、小于n的数中是m的倍数一共有n/m个
2、如果a和b都是k因数,用在思路1中会重复减去。
代码:
#include
using namespace std;
int main(){
long long n;
cin>>n;
cout<
心得:
训练的时候其实想出来了,但一直没过,心态就不稳了,赛后检查的时候才发现思路是对的,排列组合的时候少了一个数,我是大笨蛋。
B:
签到题 但全英的训练时候就没看 555后悔 略了哈巨简单
C:
思路:
最小生成树模板题
代码:
#include
#include
using namespace std;
int f[100005];
struct node{
int l,r,v;
}a[100005];
int Find(int x){
if(f[x]!=x)
return f[x]=Find(f[x]);
else
return x;
}
bool cmp(node aa,node bb){
return aa.v>n>>m;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
scanf("%d %d %d",&a[i].l,&a[i].r,&a[i].v);
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++){
int p=Find(a[i].l);
int q=Find(a[i].r);
if(p==q)
continue;
else{
f[p]=q;
ans=ans+(long long)a[i].v;
}
}
cout<
心得:
好好学图论吧
D:
思路:
1、字典序输出,排列前先排序
2、会有重复字符出现,建议使用next_permutation()函数 详情参考:大佬博客
代码:
#include
#include
#include
using namespace std;
int main(){
string s;
cin>>s;
s=s.substr(0,s.length()-1);
sort(s.begin(),s.end());
int k=0;
do{
if(k==0)
cout<
心得:
终于学会全排列了 结果还有升级版 55hh55hh 我人傻了 比赛的时候WA了4发 脑袋开始不清楚了
E:
思路:
题意:给n个星星,每个星星按y坐标从小到大,y一样x从小到大输入,然后每个星星的左下区域每包含一个星星(不包括自己),该星星就升一级;最后求等级0~n-1的星星的个数。树状数组模板题
代码:
#include
#include
using namespace std;
int n;
int a[100005]; //保存等级
int c[100005]; //从当前元素开始连续往左求lowbit(x)个数的和
int lowbit(int x){
return x&(-x);
}
int ask(int x){
int ans=0;
while(x>0){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
void add(int x){
while(x<=32005){
c[x]+=1;
x+=lowbit(x);
}
return;
}
int main(){
while(~scanf("%d",&n)){
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
int x,y;
for(int i=1;i<=n;i++){
scanf("%d %d",&x,&y);
a[ask(x+1)]++;
add(x+1);
}
for(int i=0;i
心得:
awsl
F:
思路:
开始就是动态规划 不过要输出 就要标记一下代码:
#include
#include
#include
using namespace std;
char a[1005];
char b[1005];
int dp[1005][1005];
int flag[1005][1005];
void write(int i,int j){
if(i==0||j==0)
return ;
if(flag[i][j]==0){
write(i-1,j-1);
cout<>a>>b;
for(int i=1;i<=strlen(a);i++){
for(int j=1;j<=strlen(b);j++){
if(a[i-1]==b[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
flag[i][j]=0;
}else if(dp[i-1][j]>=dp[i][j-1]){
dp[i][j]=dp[i-1][j];
flag[i][j]=1;
}else{
dp[i][j]=dp[i][j-1];
flag[i][j]=-1;
}
}
}
write(strlen(a),strlen(b));
return 0;
}
心得:
“我太菜”这句话我已经说累了
G:
思路:
语法题 mark一下吧 天哥的代码感觉好精简
代码:
#include
using namespace std;
int a[1005][1005];
int main(){
ios::sync_with_stdio(0);
int n;
cin>>n;
int x=1,y=n,k=1;
a[x][y]=1;
while(k=1&&a[x][y-1]==0)a[x][--y]=++k;
while(x-1>=1&&a[x-1][y]==0)a[--x][y]=++k;
while(y+1<=n&&a[x][y+1]==0)a[x][++y]=++k;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<
心得:
比赛心态很重要呀
H:
思路:
用数组的下标代表原字母 对应数组的值代表替代后的字母
代码:
#include
using namespace std;
char a[30];
int main(){
int n,m;
string s;
cin>>n>>m>>s;
for(int i=0;i<26;i++)
a[i]=char('a'+i);
for(int i=1;i<=m;i++){
char x,y;
cin>>x>>y;
for(int i=0;i<26;i++){
if(a[i]==x){
a[i]=y;
continue;
}
if(a[i]==y){
a[i]=x;
continue;
}
}
}
for(int i=0;i
心得:
天哥太强了