A Diagonals
题目描述
在一个矩阵中,将给定的棋子放入最少的对角线中
思路
可以画一个n*n的矩阵,对角线n个方格的只有一个,1到n-1都有两个,可以先k+n,假设有两个n,依次减,最后sum-1就行
代码
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
int sum=0;
int ans;
ans=n+n-1;
int ind,inde;
if(k==0)
{
cout<<0<<'\n';
continue;
}
else if(k>=1)
{
k=k+n;
while(k>0)
{
ind=2;
while(ind>0&&k>0)
{
k-=n;
sum++;
ind--;
}
n--;
}
}
cout<<sum-1<<'\n';
}
return 0;
}
B1 Bouquet (Easy Version)
题目描述
用给定的钱买花,花瓣尽可能多,但是买的花的花瓣数差值不能超过二
思路
就是排序找到最大挨着的数
代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef long double ld;
void solve()
{
int n; ll m;
cin >> n >> m;
ll a[n];
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a+n);
ll best = 0;
ll curr = 0;
int right = 0;
for (int i = 0; i < n; i++)
{
right = max(right, i);
curr = max(curr, 0ll);
while (right < n && (a[right]-a[i]) <= 1 && (curr+a[right]) <= m)
{
curr += a[right];
right++;
}
best = max(best, curr);
curr -= a[i];
}
cout << best << endl;
}
int main()
{
IOS;
int t;
cin >> t;
while (t--)
solve();
return 0;
}