三合一
模拟即可
#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;
}