牛客2021-9

牛客

  1. 题目链接
/*
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,
关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,
那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
*/

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

ll gcd(ll a,ll b){
    
    
    if(!b)    return a;
    else     return gcd(b,a%b);
}

int main()
{
    
    
    ll x,y;
    scanf("%lld %lld",&x,&y);
    ll ans = gcd(x,y);
    
    printf("%lld\n",ans);
    
    return 0;
}
  1. 题目链接

分析:
题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入描述:
第一行一个正整数n ≤ 987654321,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
输出描述:
求使所有人获得均等糖果的最小代价。
思路:
开始是n个小孩围成一圈,第i个小孩有ai个糖果(可以自己画个图)。他们的平均值ave就是:总的糖果数/n。可以用Xi表示第i个小孩给了第i-1个小孩Xi个糖果(即,第1个小孩给了第n个小孩X1个糖果,第二个小孩给了第一个小孩X2个糖果)。如果Xi为负数,反过来就是索取了Xi个糖果。
我们这里可以推导出:
a1-X1+X2 = avea1−X1+X2=ave
a2-X2+X3 = avea2−X2+X3=ave

an-X(n-1)+X1 = avean−X(n−1)+X1=ave
由上面又可以推出来:
X1-X2 = a1-aveX1−X2=a1−ave
X2-X3 = a2-aveX2−X3=a2−ave

Xn-1+Xn = a(n-1)-aveXn−1+Xn=a(n−1)−ave
Xn-X1 = an-aveXn−X1=an−ave
要把这些看成:
Xn = X1 -(ave - an)
Xn-1= X1 - (2ave - an - an-1)

X2=X1−((n−1)ave−an−a n−1−…−a2)
X1 =X1−0
我们要算这些每一个左边绝对值的和,在数轴上也就是每个点与点之间的距离.

// -3 -5 -4 -4

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long ll;

const int N = 1e6+7;

ll a[N],b[N];

int main()
{
    
    
    ll n;
    scanf("%lld",&n);
    
    ll avg = 0;
    for(int i=1;i<=n;i++){
    
    
        scanf("%lld",&a[i]);
        avg += a[i];
    }
    
    avg /= n;
    
    for(int i=n;i>1;i--){
    
    
        b[i] = avg - a[i] + b[i+1];
    }
    b[1] = 0;
    
    ll ans = 0;
    sort(b+1,b+n+1);
    ll mid = b[(n+1)/2];
    
    for(int i=1;i<=n;i++){
    
    
        ans += abs(b[i]-mid);
    }
    
    cout << ans << endl;
    
    return 0;
}
  1. 水题 题目链接

不论放回与否取到某种物品的概览均不变为n/N。

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int main()
{
    
    
    int t,a,b,k;
    cin >> t;
    while(t--){
    
    
        scanf("%d%d%d",&a,&b,&k);
        double ans;
        
        printf("%.3lf\n",b*1.0/(a+b));
    }
    
    return 0;
}
  1. 题目链接

注意到这里的2

// //1 1 2 3 5 8 13 21 34 55 89    两奇数 + 一偶数
// //+1/0;      奇数×奇数=奇数.  奇数×偶数=偶数.  偶数×偶数=偶数.
// // 统计偶数的个数.
 
#include <iostream>
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
typedef long long ll;
 
int main()
{
    
    
    ll a = 0,b = 0;
    ll n;
    scanf("%lld",&n);
    a = n/3;
    b = n-a;
    ll ans = 0;
     
    ans = a*b + a*(a-1)/2;
     
    printf("%lld\n",ans);
     
    return 0;
}
  1. 题目链接

DP问题,相当于01背包问题

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>

using namespace std;

char c[502][502];
int dp[502][502];

map<char,int> mp;

int main()
{
    
    
    mp['l'] = 4;
    mp['o'] = 3;
    mp['v'] = 2;
    mp['e'] = 1;
    int n,m;
    scanf("%d%d",&n,&m);
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin >> c[i][j];

    dp[1][1] = mp[c[1][1]];
    for(int i=1;i<=n;i++){
    
    
        for(int j=1;j<=m;j++){
    
    
            dp[i][j] = max(dp[i][j],dp[i-1][j]+mp[c[i][j]]);
            dp[i][j] = max(dp[i][j],dp[i][j-1]+mp[c[i][j]]);
        }
    }
    
    cout << dp[n][m] << endl;
    
    return 0;
}
  1. 题目链接
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

const int N = 5e6+3;

int a[N];

int main()
{
    
    
    int p,q,n;
    int t;
    int len;
    scanf("%d",&t);
    while(t--){
    
    
        scanf("%d%d%d",&p,&q,&n);
        len = min(q+p,n);
//         memset(a,0,sizeof(a));
        
        for(int i=0;i<n;i++){
    
    
            if(p==0&&q==0)    break;
            else if(p)    a[i] = 5,p--;
            else a[i] = 1,q--;
        }
        
        if(q){
    
    
//             int cnt;
            for(int i=0;i<n;i++){
    
    
                if(a[i]<5){
    
    
                    while(q&&a[i]<3){
    
    
                        q--;
                        a[i]++;
                    }
                }else{
    
    
                    while(q&&a[i]<8){
    
    
                        q--;
                        a[i]++;
                    }
                }
                
                if(!q)    break;
            }
        }
        
        for(int i=0;i<len;i++){
    
    
            if(a[i])
                printf("%d",a[i]);
        }
        printf("\n");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_50435987/article/details/120341802