A

直接模拟即可。

B

对数组中的值进行排序去重。发现若去重之后的数组中有大于 3 个数时无解,因为无法找到一个点到数轴上四个点的距离均相等。若去重之后的数组中只有三个值,则判断中间的值是否到两边的值相等,若不相等,同理无解,相等则解为距离。若只有两个不同的值,若中点是整数,则答案为中点到左端点的距离,否则为两点之间的距离。若只有一个不同的值,则答案直接为 0。

C

首先去掉整周的情况,先统计出有多少个完整的周。剩下为出发日所在周和结束日所在周的情况。将这两周拼成一周(十四天),枚举出发的时间,计算通过当前的食物可以到达的最远距离,取最大值后加入答案贡献即可。

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define cls(a,b) memset(a,b,sizeof(a))
#define debug(x) printf("x = %d\n",x)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
//const int maxn=
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){ll x=0,f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));return f*x;
}
/*--------------------------------------------------------*/const int s[]={0,1,2,0,2,1,0};
int a,b,c;
ll ans;void read_and_parse(){a=read(),b=read(),c=read();ans=min(a/3,min(b/2,c/2));a-=ans*3,b-=ans*2,c-=ans*2;ans*=7;
}void solve(){int res=0;for(int i=0;i<7;i++){int ret=0,aa=a,bb=b,cc=c;for(int j=i;j<i+7;j++){if(s[j%7]==0){if(aa)--aa,++ret;else break;}else if(s[j%7]==1){if(bb)--bb,++ret;else break;}else{if(cc)--cc,++ret;else break;}}res=max(res,ret);}printf("%lld\n",ans+res);
}int main(){read_and_parse();solve();return 0;
}

D

贪心策略:在阳光下且油箱未满的时候,优先采用电平来供电,其他情况下优先采用太阳能供电。

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define cls(a,b) memset(a,b,sizeof(a))
#define debug(x) printf("x = %d\n",x)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){ll x=0,f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));return f*x;
}
/*--------------------------------------------------------*/int n,b,a,now;
bool s[maxn];void read_and_parse(){n=read(),b=read(),a=read(),now=a;for(int i=1;i<=n;i++)s[i]=read();
}void solve(){for(int i=1;i<=n;i++){if(s[i]==1){if(b&&now<a){--b,++now;}else{if(now)--now;else return (void)printf("%d\n",i-1);}}else{if(now)--now;else if(b)--b;else return (void)printf("%d\n",i-1);}}printf("%d\n",n);
}int main(){read_and_parse();solve();return 0;
}

E

采用双向链表进行模拟整个过程,因为每个人会且仅会被选择一次,因此时间复杂度为 \(O(n)\)。

By wzj_xhjbk, contest: Codeforces Round #552 (Div. 3), problem: (E) Two Teams, Accepted, ##include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define cls(a,b) memset(a,b,sizeof(a))
#define debug(x) printf("x = %d\n",x)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){ll x=0,f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));return f*x;
}
/*--------------------------------------------------------*/int n,k,a[maxn],d[maxn],tag[maxn],l[maxn],r[maxn];bool cmp(int x,int y){return a[x]>a[y];}void read_and_parse(){n=read(),k=read();for(int i=1;i<=n;i++)a[i]=read(),d[i]=i,l[i]=i-1,r[i]=i+1;// 0 ~ n+1sort(d+1,d+n+1,cmp);
}void solve(){int clk=1;for(int i=1;i<=n;i++){if(tag[d[i]]!=0)continue;tag[d[i]]=clk;int pos=d[i],cnt=0,lb=0,rb=n+1;while(l[pos]&&cnt<k)pos=l[pos],tag[pos]=clk,++cnt;if(l[pos])lb=l[pos];pos=d[i],cnt=0;while(r[pos]<=n&&cnt<k)pos=r[pos],tag[pos]=clk,++cnt;if(r[pos]<=n)rb=r[pos];r[lb]=rb,l[rb]=lb;clk=clk==1?2:1;}for(int i=1;i<=n;i++)printf("%d",tag[i]);puts("");
}int main(){read_and_parse();solve();return 0;
}

F

不考虑优惠策略,可以发现买 k 个物品的最小值即为所有物品中的前 k 小值之和,因此按照物品的价格进行排序。现在考虑优惠政策,设 \(dp[i]\) 表示买 i 个物品的最小值,则状态转移方程为 \(dp[i]=min\{dp[i],dp[i-a]+\sum\limits_{i=i-a+b+1}^{n}cost[i] \}\)。其中求和部分可以利用前缀和预处理,时间复杂度为 \(O(k*m)\)。

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define cls(a,b) memset(a,b,sizeof(a))
#define debug(x) printf("x = %d\n",x)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){ll x=0,f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));return f*x;
}
/*--------------------------------------------------------*/int n,m,k,a[maxn];
ll dp[2010],sum[2010];
P off[maxn];void read_and_parse(){n=read(),m=read(),k=read();for(int i=1;i<=n;i++)a[i]=read();for(int i=1;i<=m;i++)off[i].fi=read(),off[i].se=read();sort(a+1,a+n+1),sort(off+1,off+m+1);
}void solve(){for(int i=1;i<=k;i++)sum[i]=sum[i-1]+a[i],dp[i]=sum[i];for(int i=1;i<=k;i++){for(int j=1;j<=m;j++){if(off[j].fi>i)break;dp[i]=min(dp[i],dp[i-off[j].fi]+sum[i]-sum[i-off[j].fi+off[j].se]);}}printf("%lld\n",dp[k]);
}int main(){read_and_parse();solve();return 0;
}

G

玄学复杂度。。考虑枚举 \(gcd\),每次找到序列中最小的两个数,计算最小公倍数与最优解进行比较即可。

转载于:https://www.cnblogs.com/wzj-xhjbk/p/10724177.html

【CF1154】题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. 【星榜单】盘点那些坑爹的国产手机们
  2. 论文笔记:Spatial-Temporal Map Vehicle Trajectory Detection Using Dynamic Mode Decomposition and Res-UNe
  3. html5如何划分区域,10.4 51单片机 RAM 区域的划分
  4. 15岁大学毕业,一生800多篇专著论文,双眼失明却凭一条公式称霸数学界
  5. 《全球互联网金融商业模式:格局与发展》——第3章,第3节互联网保险公司...
  6. textarea如何实现高度自适应?
  7. 遇冷的斗鱼直播,还“斗”得动吗?| 畅言
  8. 24楼,此处风景独好
  9. Front End Developer Questions 前端开发人员问题(二)
  10. 老板放过我吧!我Java8还没用呢,又让我学习Java14
  11. java ajax上传文件
  12. java标准化试题_标准化考试系统Java
  13. 持久层框架 -Xxmm.Net
  14. 如何查看计算机有无无线连接功能,你可能不知道的,电脑自带的WIFI信号发射功能!...
  15. 鱼眼镜头的成像原理到畸变矫正(完整版)
  16. superset集成echarts
  17. 如何在把微信公众号生成链接
  18. 客户画像分析用于贷中监控的案例
  19. 实验3-5 查询水果价格
  20. i3-10110U和i5 1035g7 哪个好

热门文章

  1. 饮用水用 降低COD的树脂,医药行业除COD
  2. 什么是动态、静态、伪静态
  3. java.lang.Class:是反射的源头
  4. python做大数据可视化软件_一般用哪些工具做大数据可视化分析?
  5. Day8 每日打卡 -简单可预期
  6. ms dtc 启动失败的解决办法。
  7. 日志易之Agent统一IP地址开通多个端口
  8. 休闲船的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. at89s51单片机是几位微型计算机,AT89S51单片机的硬件组成
  10. 大牛证券解析恒指大跌800点+全球股市大跌