第十四届蓝桥杯大赛软件赛省赛代码笔记(C++研究生组)

工作时长

#include<bits/stdc++.h>
using namespace std;
int main()
{
  freopen("records.txt","r",stdin);//将标准输入流stdin重定向到名为"records.txt"的文件,从这个文件读取输入
  int n,y,r,s,f,m;
  vector<int> days={0,31,28,31,30,31,30,31,31,30,31,30,31};
  vector<int> num;
  while(scanf("%d-%d-%d %d:%d:%d",&n,&y,&r,&s,&f,&m)== 6){//保证读入6个数,否则结束输入 
    int t=0;
    for(int i=0;i<y;i++){
      t+=days[i];
    }
    t+=r;
    t=t*24+s;
    t=t*60+f;
    t=t*60+m;
    num.push_back(t);
  }
  sort(num.begin(),num.end());
  int sum=0;
  for(int i=0;i<num.size();i=i+2){
    sum=sum+num[i+1]-num[i];
  }
  printf("%d",sum);
  return 0;
}

与或异或

#include <iostream>
using namespace std;
int main()
{
  int arr[5][5];
  arr[0][0]=1;
  arr[0][1]=0;
  arr[0][2]=1;
  arr[0][3]=0;
  arr[0][4]=1;
  int sum=0;
  int n=59049;//3^10,三进制,枚举所有情况
  for(int q=0;q<n;q++){
    int w=q;
    for(int i=1;i<=4;i++){
      for(int j=0;j<5-i;j++){
        int op=w%3;
        w=w/3;
        switch(op){
          case 0:arr[i][j]=arr[i-1][j]&arr[i-1][j+1];break;
          case 1:arr[i][j]=arr[i-1][j]|arr[i-1][j+1];break;
          case 2:arr[i][j]=arr[i-1][j]^arr[i-1][j+1];break;
        }
      }
    }
    if(arr[4][0]==1)sum++;
  }
  printf("%d",sum);
  return 0;
}

翻转

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int n;
  int i=0;
  cin>>n;
  while(i<n){
    i++;
    string t,s;
    int m,q=0;
    cin>>t;
    cin>>s;
    m=t.size();
    for(int j=1;j<m-1;j++){//将T中000或者111的对应S判断一下,假如是101或者010就换过来
      if(t[j]==t[j-1]&&t[j]==t[j+1]){
        if(s[j]!=s[j-1]&&s[j]!=s[j+1]){
          s[j]=s[j+1]=s[j-1]=t[j];
          q++;
      }
    }
  }
  int pd=0;
  for(int j=0;j<m;j++){
    if(t[j]!=s[j]){
      pd=1;
      break;
    }
  }
  if(pd==0){
    cout<<q<<endl;
  }
  else{
    cout<<"-1"<<endl;
  }
  }
  return 0;
}

阶乘的和

意思是的最大因数为m!,求m。

=(A1!+A2!+..+An!)=min(A1!,A2!,..,An!)*b=m!*b

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;
  int s[100010];
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>s[i];
  }
  sort(s,s+n);
  int x=s[0];
  int y=0;
  for(int i=0;i<n;i++){//枚举所有情况,这个方法比较麻烦
    if(s[i]==x){
    	y++;
	}
	else{
		if(y%(x+1)!=0){
			cout<<x<<endl;
			return 0;
		}
		else{	
			while(y%(x+1)==0&&y&&x!=s[i]){
			  y=y/(x+1);
			  x++;
			}
			if(x==s[i]){
				y++;
			}
			else{
				cout<<x<<endl;
				return 0;
			}
		}
	}
  }
  while(y%(x+1)==0&&y){
  	y=y/(x+1);
	x=x+1;
  }
  cout<<x<<endl;
  return 0;
}

公因数匹配

#include<bits/stdc++.h>
using namespace std;
int N=1000010;
map<int,vector<int>> v;
int main(){
  
  int n;
  cin>>n;
  for(int i=1;i<=n;i++){//一个数是由若干质数相乘组成,找出所有数的质数
    int x;
    cin>>x;
    for(int j=2;j<=x/j;j++){
      if(x%j==0){
        while(x%j==0){
          x=x/j;
        }
        v[j].push_back(i);
      }
    }
    if(x>1){
      v[x].push_back(i);
    }
  }
  int f=n+1,l=n+1;
  for(auto [x,y]:v){//找出质数中最小的那组
    if(y.size()>=2){
      if(y[0]<f){
        f=y[0];
        l=y[1];
      }
      else if(y[0]==f){
        if(y[1]<l){
          l=y[1];
        }
      }
    }
  }
  cout<<f<<" "<<l<<endl;
  return 0;
}

子树的大小

规律

a

a*3-1 a*3 a*3+1

(a*3-1)*3-1 ... (a*3+1)*3+1

a

a*2 a*2+1

a*2*2 ... (a*2+1)*2+1

m=2,3...

a

a*m-m+2 ... a*m+1

(a*m-m+2)*m-m+2 ... (a*m+1)*m+1

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long T,n,m,k;
    cin>>T;
    for(int i=1;i<=T;i++){
        cin>>n>>m>>k;
        long long sum=0;
        long long kl=k,kr=k;
        while(kr<=n){
            if(kr<=n){
                sum=sum+kr-kl+1;
            }
            kl=kl*m-m+2;
            kr=kr*m+1;
        }

        if(kr>n&&kl<=n){
            sum=sum+n-kl+1;
        }
        cout<<sum<<endl;
    }
    return 0;
}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值