东华大学码蹄集oj赛第一周(三合一,竖直打印机,硬币塔,巨大的错误,三角形个数)

三合一
在这里插入图片描述
模拟即可

#include<bits/stdc++.h> 

using namespace std;

vector<int> v;
int main( )
{
    int n;
    cin >> n;
    for (int i = 1; i <= n;i++)
        {
            int x;
            cin>>x;
            v.push_back(x);
        }
        int num = 0;
        while (1)
        {
            int len=v.size();
            if (len <= 2)
                break;
            num++;

            for (int i = 0; i + 2 < len;i++)
            {
                if ((v[i+0] + v[i+1] + v[i+2]) <= num * 3)
                {
                    int sum=v[i+0] + v[i+1] + v[i+2];
                    v[i]=sum;
                    v.erase(v.begin()+i+1);
                    v.erase(v.begin()+i+1);
                    len-=2;
                }
            }
        
    }
    cout << num << endl;

    system("pause");
    return 0;
}

竖直打印机
在这里插入图片描述

#include<bits/stdc++.h> 

using namespace std;

string a[1001];
int main( )
{
    string str;
    char ch;
    int mx = 0;
    int k = 0;
    while(cin>>str)
    {
     a[k++] = str;
     mx = max(mx, (int)str.length());
      if(ch=cin.get()=='\n')
         break;
    }
    //cout << mx << endl;
    //cout << k << endl;
    for (int i = 1; i <= mx;i++)
    {
     for (int j = 0; j < k;j++)
     {
        if(a[j].length()<i)
            cout << " ";
        else
            cout << a[j][i - 1];
     }
     cout << endl;
    }

    //system("pause");
    return 0;
}

硬币塔
看的别人的代码
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
typedef pair<ll, ll> pii;
#define SIZE 40

map<pii, ll> ma;
ll height[SIZE + 1] = {1};

ll getAB(ll a, ll b) {  // a层塔的下b层有多少个金币
    ll originalB = b;
    if (ma.count({a, b}))
        return ma[{a, b}];
    if (a == 0) {
        return ma[{a, b}] = 1;
    }
    ll ans = 0;
    b--;  // 最下面的银币
    if (b > 0) {
        ll removeHeight = min(height[a - 1], b);
        b -= removeHeight;
        ans += getAB(a - 1, removeHeight);
    }
    if (b > 0) {
        ll removeHeight = min(a, b);  // 中间有a个金币
        b -= removeHeight;
        ans += removeHeight;
    }
    if (b > 0) {
        ll removeHeight = min(height[a - 1], b);
        b -= removeHeight;
        ans += getAB(a - 1, removeHeight);
    }
    b--;
    return ma[{a, originalB}] = ans;
}


int main(int argc, char** argv) {
    for (ll i = 1; i <= SIZE; i++) {
        height[i] = 1 + height[i - 1] + i + height[i - 1] + 1;
    }
    ll a, b;
    cin >> a >> b;
    if (!b) {
        puts("0");
        return 0;
    }
    ll ans = getAB(a, b);
    printf("%lld\n", ans);
    return 0;
}

巨大的错误
简单的组合数学

在这里插入图片描述

#include<bits/stdc++.h> 

using namespace std;
long long dp[21];
long long  c(int n,int m)
{
    long long ans1=1,ans2=1;
    for(int i=n,j=m;j>=1;j--,i--)
    {
        ans1=ans1*i;
        ans2=ans2*j;
    }

    return ans1/ans2;
}
long long a(int n)
{
    long long ans=1;
    for(int i=1;i<=n;i++)
    ans=ans*i;
    return ans;
}
int main( )
{
    int n;
    cin>>n;
    if(n<=1)
    {
        cout<<0<<endl;

        return 0;
    }
    dp[0]=1;
    dp[2] = 1;
    dp[3] = 2;
    //cout << num << endl;
    //cout << c(5, 2) << endl;
    for (int i = 4; i <= n;i++)
    {
       dp[i] = a(i);
    for (int j = 1; j <= i; j++)
       {
           if(j==i-1)continue;
          dp[i] -= c(i, j) * dp[i - j];
       }
       
    }
    // dp[4]-4*

    cout<<dp[n]<<endl;

    //system("pause");
    return 0;
}

三角形个数

推一下递推公式
//(n+1)(2nn+3n-1)/8 n奇数
//n*(n+2)(2n+1)/8 n偶数
在这里插入图片描述

#include<bits/stdc++.h> 
//(n+1)*(2*n*n+3*n-1)/8   n奇数
//n*(n+2)*(2*n+1)/8   n偶数
using namespace std;

int main( )
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        if(n&1)cout<<(n+1)*(2*n*n+3*n-1)/8<<endl;
        else cout<<n*(n+2)*(2*n+1)/8<<endl;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值