Blue Bridge 31 days | 4 questions today Day15 | C++

1. Formula 900insert image description here

Full arrangement, pay attention to the output

#include <iostream>
#include <vector>
using namespace std;
const int N=10;
vector<int>ans;
bool st[N];
int calc(int l,int r){
    
    
  int s=0;
  for(int i=l;i<r;i++){
    
    
    s*=10;
    s+=ans[i];
  }
  return s;
}
void check(vector<int>ans){
    
    
      if(ans[0]==0||ans[4]==0||ans[8]==0)return;
      int a=calc(0,4);
      int b=calc(4,8);
      int c=calc(8,10);
      if(a==5012&&b==4987&&c==36)return;
      if((a-b)*c==900){
    
    
        printf("(%d-%d)*%d=900",a,b,c);
        return;
      }
      return;
}
void dfs(int level){
    
    
    if(level==10){
    
    
      check(ans);
      return;
    }
    for(int i=0;i<=9;i++){
    
    
       if(!st[i]){
    
    
         st[i]=true;
         ans.push_back(i);
         dfs(level+1);
         ans.pop_back();
         st[i]=false;
       }
    }
}
int main()
{
    
    
  dfs(0);
  return 0;
}

2. Negotiation

insert image description here
Huffman

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    
    
  int n;
  scanf("%d",&n);
  priority_queue<int,vector<int>,greater<int>>heap;
  for(int i=0;i<n;i++){
    
    
    int x;
    scanf("%d",&x);
    heap.push(x);
  }
  int ans=0;
  while(heap.size()>1){
    
    
    int a=heap.top();heap.pop();
    int b=heap.top();heap.pop();
    ans+=a+b;
    heap.push(a+b);
  }
  printf("%d",ans);

  return 0;
}

3. Lucky numbers

insert image description here
insert image description here
topic link

#include <iostream>
using namespace std;
const int N=1e6+10;
bool st[N];
int main(){
    
    
  int n,m;
  scanf("%d%d",&n,&m);
  st[0]=true;
  for(int i=2;i<m;i++){
    
    
    if(!st[i]){
    
    
      int count=0,j=0;
      while(j<m){
    
    
        if(!st[++j]&&++count%i==0)st[j]=true;
      }
    }
  }
  int ans=0;
  for(int i=n+1;i<m;i++){
    
    
    if(!st[i])ans++;
  }
  printf("%d",ans);
  return 0;
}

4.123

insert image description here
Topic link
insert image description here
insert image description here
long long array maximum length
len = 256 1024 1024/8=33554432 << 1e12

#include <iostream>
using namespace std;
typedef long long LL;
const LL M=1e12+10;
const LL N=1e7+10;
LL sum[N];
LL cnt;
//1   sum[1]=1
//1 2  sum[2]=3+sum[1]
//1 2 3 sum[3]=6+sum[2]
//1 2 ..n sum[n]=(1+n)*n/2+sum[n+1]
void f(){
    
    
 for(LL i=1;i<N;i++){
    
    
   LL res=i*(i+1)/2;
   if(res>M)break;
   sum[i]=res;
   sum[i]+=sum[i-1];
   cnt++;
  
 }
 return;
}
LL search(LL x){
    
    
 if(x==0)return 0;
 LL l=0,r=cnt,mid;
 //寻找x的上面有几层
 while(l<r){
    
    
   mid=(l+r+1)>>1;
   if(mid*(mid+1)/2<=x)l=mid;
   else r=mid-1;
 }
 //x是l+1层第k个数

 LL ans=sum[l];
 LL k=x-l*(l+1)/2;
 ans+=k*(k+1)/2;
 return ans;
}
int main()
{
    
    
 LL n;
 scanf("%lld",&n);
 f();
 while(n--){
    
    
   LL a,b;
   scanf("%lld%lld",&a,&b);
   printf("%lld\n",search(b)-search(a-1));
 }

 return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324098524&siteId=291194637