每日一题~961div2A+B+C(阅读题,思维,数学log)

A

题意:给你 n*n 的表格和k 个筹码。每个格子上至多放一个

问至少占据多少对角线。

显然,要先 格数的多的格子去放。

n n-1 n-2 ...1 只有n 的是一个(主对角线),其他的是两个。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

void solve()
{
    int n,k;cin>>n>>k;
    if (k==0){
        cout<<0<<"\n";
        return ;
    }
    k-=n;
    if (k<=0){
        cout<<1<<"\n";
        return ;
    }
    int cnt=1;
    for (int i=n-1;i>=1;i--){
        k-=i;cnt++;
        if (k<=0){
            cout<<cnt<<"\n";
            return ;
        }
        k-=i;cnt++;
        if (k<=0){
            cout<<cnt<<"\n";
            return ;
        }
    }
}
int  main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t; t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

B

题意:

n 中花,每中花有花瓣数。

a1 a2 ...an

这朵花的花费也是花瓣数,

选择的花中,花瓣数像相差不能超过1.

有m 个金钱。

问最多花销是多少。

思路:

我们直接用map<int,int>cnt 统计每种花瓣数量的 个数。我们最多选择两种花瓣数。

枚举每一种一种花瓣数,去迭代答案。

对于 t t+1。其实我们尽可能的让 t的花销加上 t+ 1的花销 逼近m。

我们可以先固定一个。

我们先尽可能的 选 t 。

能选出来的个数 是 int k=min(cnt[t],m/t)

之后剩下的钱是 lef=m-k*t;

这些钱里 能选出来 t+ 1 的个数 是 int k1=min(cnt[t+1],lef/(t+1))

之后 再剩下的钱 ,可以用 t+1 替换t 。这样可以增加1的花销。

最大限度的替换 次数 是 t 的可以选出来的个数,剩下的钱,t+1选完之后剩下的个数。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long 
void solve()
{
    int n,m; cin>>n>>m;
   map<int,int>cnt;
    int t;
    for(int i=0;i<n;i++)
    {
        cin>>t;cnt[t]++;
    }
    int ans=0;
    for (auto x:cnt){
         t=0;
        int u=x.first;
        int v=u+1;
        if (cnt.count(v)){
            //最多能 买 前者的数量。
            int k=min(cnt[u],m/u);
            t+=u*k;
            int res=m-u*k;
            // 计算买 后者的数量
            int k1=min(cnt[v],res/v);
            t+=k1*v;
            //替换产生的收益
            int tt=m-t;
            t+=min(k,min(tt,cnt[v]-k1));
            
       }
        else {
            int k=min(cnt[u],m/u);
            t+=u*k;
        }
        ans=max(ans,t);
    }
    cout<<ans<<"\n";
  return; 
}
signed  main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

C

题意:

n

n 个数,a1,a2,a3,a4 ...an

可以进行的操作:对每个数 进行平方,使得最终的数组非降。

问最少的操作数。

最暴力的做法,就是 扫一遍数组,如果后面的小于前面的,那么就一直做平方的操作。

但是这么写的话,会导致超long long.毕竟范围是1e6 ,如果几个1e6 连在一起,那么1e6 1e12 1e24.况且一直这样平方很有可能超时。

所以我们可以考虑 取 log的操作。

对于这种题,应该好好弄明白操作的,我当时没弄太懂就去写了。

搞不清楚 次幂的 数值了。越写越糊涂qaq。


后面的式子,向上取整。

注意一下精度的问题。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long 
void solve()
{
    int n;cin>>n;
    vector<double>a(n,0);
    for (int i=0;i<n;i++)
        cin>>a[i];

    double lst=0,ans=0;
    for (int i=1;i<n;i++)
    {
        if (a[i-1]==1)continue;
        int j=(int)(floor(log2(log(a[i])/log(a[i-1]))));
        if (j>=lst){
            lst=0;
            continue;
        }
        if (a[i]==1){
            cout<<-1<<"\n";
            return;
        }
        int k=ceil(lst-log2(log(a[i])/log(a[i-1])));
        ans+=k;lst=k;
    }
    cout<<(int)ans<<"\n";
}
signed  main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t; //t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

感觉div2 前面的题面

,很喜欢定义一些东西,问达到一定的目标的最少操作数,感觉这些题,主要还是理解定义,能明白本质。然后要关注一下特殊的位置。

多举点例子。好好思考。希望可以尽快追上大家。脑子多练练qaq.太菜了...

对于位运算的题,以按位去思考(我在说什么废话,位运算不按位思考,还能怎么思考)很多时候,都和贡献联系起来。

对于一些明显的数学题,往 gcd lowbit 上面去靠。猜猜~~

一定要记得 算贡献的方法~~

多说无益,做题为上~

相关推荐
pianmian114 分钟前
python数据结构基础(7)
数据结构·算法
闲晨16 分钟前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表
jrrz08283 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time3 小时前
golang学习2
算法
南宫生4 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步5 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
DARLING Zero two♡5 小时前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技