贪心
每次都先让b减到1,然后再去选择工具来增加时间
AC代码:
- #include
- #define endl '\n'
- #define int long long
- using namespace std;
- const int N=110;
- int x[N];
- int a,b,n;
- void solve() {
- cin>>a>>b>>n;
- for(int i=1;i<=n;i++) cin>>x[i];
- sort(x+1,x+1+n);
- int ans=0;
- for(int i=1;i<=n;i++){
- ans+=b-1;
- b=1;
- b=min(b+x[i],a)-1;
- ans++;
- }
- ans+=b;
- cout<
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int t=1;
- cin>>t;
- while(t--) {
- solve();
- }
- return 0;
- }
一开始只记录a,b的最小值和最大值,没有考虑到a的最小值去换b的最大值,然后b的最小值去换a的最大值时可能b的最小值不是刚换过来的a的最小值
- #include
- #define endl '\n'
- #define int long long
- using namespace std;
- const int N=55;
- int a[N],b[N];
- int n,m,k;
- void solve() {
- cin>>n>>m>>k;
- int mina=2e9,minb=2e9;
- int maxa=0,maxb=0;
- int ans=0;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- ans+=a[i];
- mina=min(mina,a[i]);
- maxa=max(maxa,a[i]);
- }
- for(int i=1;i<=m;i++){
- cin>>b[i];
- minb=min(minb,b[i]);
- maxb=max(maxb,b[i]);
- }
- if(mina>=maxb){
- if(k%2==0) ans=ans-maxa+minb;
- }
- else{
- if(k%2==1) ans=ans-mina+maxb;
- }
- cout<
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int t=1;
- cin>>t;
- while(t--) {
- solve();
- }
- return 0;
- }
最优策略就是用最小值去换最大值
可以模拟第一回合和第二回合的情况,这样就涵盖了所有的情况了,当k为奇数时,和第一回合答案一样,当k为偶数时,和第二回合答案一样
AC代码:
- #include
- #define endl '\n'
- #define int long long
- using namespace std;
- const int N=55;
- int a[N],b[N];
- int n,m,k;
- void solve() {
- cin>>n>>m>>k;
- int ans1=0,ans2=0;
- for(int i=1;i<=n;i++) cin>>a[i];
- for(int i=1;i<=m;i++) cin>>b[i];
- sort(a+1,a+1+n);
- sort(b+1,b+1+m);
- if(a[1]
- swap(a[1],b[m]);
- sort(a+1,a+1+n);
- sort(b+1,b+1+m);
- }
- for(int i=1;i<=n;i++) ans1+=a[i];
- for(int i=1;i<=n;i++) ans2+=a[i];
- if(k%2==1) cout<
- else cout<
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int t=1;
- cin>>t;
- while(t--) {
- solve();
- }
- return 0;
- }
如果用小数做的话,由于数过于大,会有精度问题
错误代码:
- #include
- #define endl '\n'
- #define int long long
- using namespace std;
- int n,m;
- void solve() {
- cin>>n>>m;
- if(n%m==0){
- cout<<0<
- return;
- }
- if(n>m) n%=m;
- double x=(double)n/m;
- double y=0.5;
- if(x
swap(x,y); - double diff;
- if(x!=y) diff=x-y;
- else diff=x;
- while(diff>0.5){
- if(x
swap(x,y); - diff=x-y;
- x-=y;
- }
- double d=0.5;
- while(d>0){
- d-=diff;
- }
- if(d!=0){
- cout<<-1<
- return;
- }
- int cnt=0;
- for(double i=1;;i/=2){
- if(i==diff) break;
- cnt++;
- }
- int ans=0;
- for(int i=1;i<=cnt-1;i++){
- ans+=n;
- n*=2;
- }
- ans+=m/2;
- cout<
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int t=1;
- cin>>t;
- while(t--) {
- solve();
- }
- return 0;
- }
f(n,m)表示n个苹果均分给m个人的次数

由于m最大1e9,n最小为1,所以最多log1e9次,大概30次
AC代码:
- #include
- #define endl '\n'
- #define int long long
- using namespace std;
- int n,m;
- void solve() {
- cin>>n>>m;
- n%=m;
- int ans=0;
- int cnt=0;
- while(n){
- ans+=n;
- n*=2;
- n%=m;
- cnt++;
- if(cnt>30) break;
- }
- if(n%m){
- cout<<-1<
- return;
- }
- cout<
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int t=1;
- cin>>t;
- while(t--) {
- solve();
- }
- return 0;
- }
-
相关阅读:
HTTP协议详解
R-GIS: 如何用R语言实现GIS地理空间分析及模型预测
第十三届蓝桥杯嵌入式省赛程序设计详细题解
计算机算法分析与设计(11)---贪心算法(活动安排问题和背包问题)
图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲
LeetCode 18 四数之和
Vue-MVVM数据双向绑定响应式原理之Object.defineProperty
6.2 事件的创建,修改和删除
Ansible 快速入门到放弃
【附源码】计算机毕业设计java裕民镇养老院信息管理系统设计与实现
-
原文地址:https://blog.csdn.net/m0_74087709/article/details/133514107
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU