首页 > 其他分享 >牛客六

牛客六

时间:2024-02-25 13:33:36浏览次数:18  
标签:int ++ long fib 牛客 vector left

1.B爱恨的纠葛(先将ab排序,再二分查找ab元素间差值最小的一对,再从a和c中找出对应下标(因为第二个数组不能动),再交换a的两个下标位置的值)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[1000005];
 4 int b[1000005];
 5 int c[1000005];
 6 void solve(int n)
 7 {
 8     for(int i=1;i<=n;i++)
 9     {
10         cin>>a[i];
11     }
12     for(int i=1;i<=n;i++)
13     {
14         cin>>b[i];
15         c[i] = b[i];
16     }
17     sort(a+1,a+n+1);
18     sort(b+1,b+n+1);
19     int l   = 1 ,r   = 1;
20     int p1 = 0, p2 = 0;
21     int Min = 0x3f3f3f;
22     while(l<=n && r<=n)
23     {
24         if(abs(a[l]-b[r])<Min)
25         {
26             p1 = a[l];
27             p2 = b[r];
28             Min = abs(a[l]-b[r]);
29         }
30         if(a[l]<b[r])
31         {
32             l++;
33         }
34         else
35         {
36             r++;
37         }
38     }
39     int x = 1;
40     for(int i=1;i<=n;i++)
41     {
42         if(p1==a[i])
43         {
44             x = i;
45             break;
46         }
47     }
48     int y = 1;
49     for(int i=1;i<=n;i++)
50     {
51         if(p2 == c[i])
52         {
53             y = i;
54             break;
55         }
56     }
57     swap(a[x],a[y]);
58     for(int i=1;i<=n;i++)
59     {
60         cout<<a[i]<<" ";
61     }
62 }
63 signed main() {
64     ios::sync_with_stdio(0);
65     cin.tie(0) , cout.tie(0);
66     int n;
67     cin>>n;
68     solve(n);
69     return 0;
70 }

2.C心绪的解剖(用一个数组存斐波那契数列,通过big函数找出剩下的最大的斐波那契数,再递归直到left为0,将这些数存入数组,如果数组空间小于等于三,说明成立,缺位用0补位即可,如果大于三则不成立输出-1)

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define N 91
 4 using namespace std;
 5 int b;
 6 ll b1[1000];
 7 long long fib[N]={1,2};
 8 void fi()
 9 {
10     for (int i = 2; i < N; i++)
11         fib[i] = fib[i - 2] + fib[i - 1];
12 }
13 int big(long long n)
14 {
15     int k;
16     for (k = 0; k < N; k++)
17         if (fib[k + 1] > n)return k;
18     return 0;
19 }
20 void solu(long long n, bool first)
21 {
22     int k;
23     if(big(n))k= big(n);
24     long long left = n - fib[k];
25     if (first)
26     {
27         if (!left)
28         {
29             b1[b++]=n;
30             return;
31         }
32         if (left>0)
33             solu(left, false);
34         b1[b++]=fib[k];
35     }
36     else
37     {
38         if (left>0)
39             solu(left, false);
40         b1[b++]=fib[k];
41     }
42 }
43 int main()
44 {
45     fi();
46     int T;
47     cin >> T;
48     while (T--)
49     {
50         long long n;
51         cin >> n;
52         b=0;
53         solu(n, true);
54         if(b==3)
55         {
56             for(int i=0;i<3;i++)cout<<b1[i]<<" ";
57         }
58         else if(b<3)
59         {
60             for(int i=0;i<b;i++)cout<<b1[i]<<" ";
61             for(int i=0;i<3-b;i++)cout<<0<<" ";
62         }
63         else cout<<-1<<endl;
64         cout << endl;
65     }
66     return 0;
67 }

3.I时空的交织(该题是很典型的求子矩阵最大和问题,但是由于空间限制,只能通过线性求最大子序列来求)

空间小的常规做法

#include <bits/stdc++.h>空间超了
using namespace std;
const int N=10001;
#define int long long
int a[N][N],f[N],d[N];
signed main()
{
    int n, m;
    cin >> n >> m;

    vector<int> a(n + 1), b(m + 1);
    vector<vector<int>> c(n + 1, vector<int>(m + 1));
    vector<vector<int>> sum(n + 1, vector<int>(m + 1));
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    for(int i = 1; i <= m; i++) {
        cin >> b[i];
    }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        {
            c[i][j]=a[i]*b[j];
            c[i][j] +=c[i-1][j];
        }
    int ans=-2e9;
    for (int i=1;i<=n;i++)
        for (int k=1;k<=i;k++)
        {
            memset(f,0,sizeof f);
            memset(d,0,sizeof d);
            for (int j=1;j<=m;j++)
            {
                f[j]=c[i][j]-c[i-k][j];
                d[j]=max(d[j-1]+f[j],f[j]);
                ans=max(ans,d[j]);
            }
        }
    cout<<ans;
    return 0;
}

该题做法

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 int a[100000],b[100000];
 5 signed main()
 6 {
 7      int m,n;
 8      cin>>n>>m;
 9      int p,q;
10      int Max1=LLONG_MIN,Min1=LLONG_MAX ;
11      for(int i=0;i<n;i++)
12      {
13          cin>>a[i];
14          if(i<1)p=a[i],q=a[i];
15          else p=max(a[i],p+a[i]),q=min(a[i],q+a[i]);
16          Max1=max(p,Max1),Min1=min(q,Min1);
17      }
18     int Max2=LLONG_MIN,Min2=LLONG_MAX ;
19     for(int i=0;i<m;i++)
20     {
21         cin>>b[i];
22         if(i<1)p=b[i],q=b[i];
23         else p=max(b[i],p+b[i]),q=min(b[i],q+b[i]);
24         Max2=max(p,Max2),Min2=min(q,Min2);
25     }
26     int end=LLONG_MIN;
27     end=max({end,Max1*Max2,Max1*Min2,Min1*Max2,Min1*Min2});
28     cout<<end<<endl;
29     return 0;
30 }

 

标签:int,++,long,fib,牛客,vector,left
From: https://www.cnblogs.com/violet-hty/p/18032294

相关文章

  • 牛客4
    1.D守恒(主要通过数份数来和n作比较,一定要特判1这个特殊情况)#include<bits/stdc++.h>usingnamespacestd;longlongt[1000000];voidsolve(){intn;cin>>n;longlongsum=0,ans=0;for(inti=0;i<n;i++){cin>>t[i];sum+=t[i]......
  • 2024牛客寒假算法基础集训营4个人补题题解(B、E)
    B、左右互博不能操作的情况有且仅有所有石子堆的石子个数只有1的时候,因此不管途中怎么操作,让所有石子堆都变成1的总操作次数是确定的。即假设一共有\(n\)堆石子,石子总数为\(sum\),总操作次数为\((sum-n)\)次。因此当\((sum-n)\)%\(2=0\)时一定在sweet操作完(或没有操作)后gui无法......
  • 2024牛客寒假算法基础集训营3
    2024牛客寒假算法基础集训营3A 智乃与瞩目狸猫、幸运水母、月宫龙虾题意给出若干组字符串,判断无视大小写,判断首字母是否相同思路如果首字母相同,则直接用\(==\)比较即可,如果首字母只有大小写的区别,则ASCII码值相差\(32\)代码/*******************************|Author:......
  • 2024牛客寒假算法基础集训营6
    2024牛客寒假算法基础集训营6比赛链接打一半就收拾行李了,不想开学呜呜呜(应该是lzgg出的题)A.宇宙的终结思路数据不大才100,所以模拟完全可以过去Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()std::vector<......
  • 2024牛客寒假算法基础集训营6
    A.宇宙的终结Code(伪代码):voidsolve(){intleft,right;cin>>left>>right;autocheck1=[&](intn){for(inti=2;i<=sqrt(n);i++){if(n%i==0){returnfalse;}......
  • 2024牛客寒假算法基础集训营5
    A.总数-1的个数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn;cin>>n;intans=0;for(inti=1,x;i<=n;i++){cin>>x;if(x==1)c......
  • 2024牛客寒假算法基础集训营5
    2024牛客寒假算法基础集训营5比赛链接赛时出了五题,被自己不严谨的思维害惨了,之后的题晚几天再补,要开学了A.mutsumi的质数合数思路既不是质数也不是合数恐怕非1莫属了吧Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()......
  • 2024牛客寒假算法基础集训营4
    2024牛客寒假算法基础集训营4比赛地址A.柠檬可乐思路:简单的模拟,按照题目描述判断大小即可Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()voidsolve(){ inta,b,k; cin>>a>>b>>k; if(a>=k*b)cout<<&qu......
  • 2024牛客寒假算法基础集训营4
    A.直接计算#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){inta,b,k;cin>>a>>b>>k;if(a>=k*b)cout<<"good";elsecout<&l......
  • 寒假训练第四周(牛客训练营)
    E-漂亮数组_2024牛客寒假算法基础集训营4(nowcoder.com)这题想多了,以为是一个dp优化,没想到贪心即可,dp比较弱,赶紧优化题解:找一个区间满足k倍即可,我们直接累加然后模k如果出现两次模k等于同一个数那么这个区间就是k的倍数记录即可简单贪心,没想到#include<bits/stdc++.h>//#p......