每日一题~961div2A+B+C(阅读题,思维,数学log)
创始人
2024-12-16 09:34:12

A
题意:给你 n*n 的表格和k 个筹码。每个格子上至多放一个
问至少占据多少对角线。
显然,要先 格数的多的格子去放。
n n-1 n-2 …1 只有n 的是一个(主对角线),其他的是两个。

#include  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<             cout<     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 个金钱。
问最多花销是多少。

思路:
我们直接用mapcnt 统计每种花瓣数量的 个数。我们最多选择两种花瓣数。
枚举每一种一种花瓣数,去迭代答案。
对于 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选完之后剩下的个数取最小值。

#include  using namespace std; #define int long long  void solve() {     int n,m; cin>>n>>m;    mapcnt;     int t;     for(int i=0;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<     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。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
后面的式子,向上取整。
注意一下精度的问题。

#include  using namespace std; #define int long long  void solve() {     int n;cin>>n;     vectora(n,0);     for (int i=0;i>a[i];      double lst=0,ans=0;     for (int i=1;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 前面的题面
,很喜欢定义一些东西,问达到一定的目标的最少操作数,感觉这些题,主要还是理解定义,能明白本质。然后要关注一下特殊的位置。对于一些多解的问题,肯定是有一种简单的通解。这些问题看样例用处不大。一般样例的结果不具有普遍性。
多举点例子。好好思考
对于位运算的题,以按位去思考(我在说什么废话,位运算不按位思考,还能怎么思考)很多时候,都和贡献联系起来。
对于一些明显的数学题,往 gcd lowbit 上面去靠。猜猜~~

一定要记得 算贡献的方法~~
多说无益,做题为上~

相关内容

热门资讯

“无人家务”渐行渐近 记者 李 均 宋迎迎 从AI技术的持续突破,到各类AI产品与智能终端的加速落地,再到智慧生活场景的日...
苏州工业园区 2026年防灾减... 在第18个全国防灾减灾日到来之际,5月11日,苏州工业园区2026年防灾减灾宣传周启动仪式暨AI赋能...
【好物】雅诗兰黛第7代小棕瓶京... 全网 618 大促现已正式开始,全场均年度好价,有需求的小伙伴速抢哦: 京东无门槛红包 京东无门槛...
原创 1... 2011年4月底,郴州开往湖北的火车上,一名少年满头大汗地捂着腰部,低声呻吟。列车员和周围乘客焦急地...
Geekom Air12 20... 随着中国制造商在紧凑且高性能迷你电脑领域的崛起,Geekom已成为备受瞩目的品牌之一。此前,其AMD...