2019 ACM训练计划——( 每天5题 ) 训练计划13
发布日期:2021-06-29 14:25:54 浏览次数:3 分类:技术文章

本文共 2874 字,大约阅读时间需要 9 分钟。

A


题目大意

给你两种类型的管道,我们的管道可以旋转90°,为了让我们能让水流动,现在让你判断给定的两条管道,是否可以将水从左上角位置留到右下角位置


题解

dfs分情况搜,当x==0我们只能向右或者向下走 当x=1我们只能向右或者向上走

#include
using namespace std;int t,n,ff;const int maxn=2e5+10;char s[3][maxn];void dfs(int x,int y,int t){
if(y>=n) return; if(x==1&&y==n-1&&t==3){
ff=1; return; } //向右或者向下 if(x==0){
if(t==2){
if(s[x+1][y]!='1'&&s[x+1][y]!='2') dfs(x+1,y,3); } else if(t==3){
if(s[x][y+1]=='1'||s[x][y+1]=='2') dfs(x,y+1,3); else dfs(x,y+1,2); } } //向右或者向上 else if(x==1){
if(t==2){
if(s[x-1][y]!='1'&&s[x-1][y]!='2') dfs(x-1,y,3); } else if(t==3){
if(s[x][y+1]=='1'||s[x][y+1]=='2') dfs(x,y+1,3); else dfs(x,y+1,2); } }}int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>t; while(t--){
cin>>n; ff=0; cin>>s[0]>>s[1]; //cout<
<<" "<
<

B


题目大意

将自然数中的偶数与奇数进行划分,先拿奇数再拿偶数,然后求对应位置元素


题解

结论:如果自然数为奇数 那么奇数个数比偶数个数多1,如果自然数为偶数,那么奇数个数等于偶数个数 我们分情况讨论即可

#include
using namespace std;typedef long long ll;int main(){
ios::sync_with_stdio(false); cin.tie(0); ll n,k; cin>>n>>k; ll m=(n+1)/2; long long cc=0; if(k<=m){
cc=1; for(int i=1;i<=k-1;i++) cc+=2; }else{
k-=m; cc=2; for(int i=1;i<=k-1;i++) cc+=2; } cout<
<

C


题目大意

给你n位数,问是否能找到一个n位数被t整除


题解

有一种特殊情况,当n=1并且t=10时,此时应该输出-1 即不存在

其他情况都是能找到的,只是在t的后面加上n-1个0

#include
using namespace std;int n,t;int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>n>>t; if(n==1&&t==10){
cout<<-1<

D


题目大意

给你m,s,分别代表构成数字的长度和值。

例如m=2,s=15,这样可以构成69 , 78,87,96…等等数字。我们只用求出最小的这种数和最大的这种数就行了。


题解

对于给定的m和s 需要进行特殊情况处理-> 如果只有1位数 位数和为0的话 最小和最大都是0 满足条件 但是位数和为0的其它情况就不满足 另外,当位数乘以9之后的结果如果比总和还要小的话也是不满足的

对于最小值的情况,贪心策略如下:尽可能让前面小,不过注意前导0的情况,特殊处理一下就好了 然后对于当前位的数字 就将后面的数字假装填满了9

然后对于最大值的情况,贪心策略如下:从首位开始能放9的直接放9,不能放9的话就取剩下的值即可

#include
#define endl '\n'using namespace std;int m,s;string smin,smax;int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>m>>s; if(m==1&&s==0){
cout<<0<<" "<<0<
9) cc=9; else cc=ans; ch='0'+cc; smax+=ch; ans-=cc; } cout<
<

E


题目大意

国王想要平分钱财,问最少需要多少金币


题解

水题,找到最大的金币,然后求出与其它人的差值总和即可

#include
using namespace std;typedef long long ll;const int maxn=110;ll a[maxn],n;int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>n; ll remax=-1; for(int i=0;i
>a[i]; remax=max(remax,a[i]); } ll ans=0; for(int i=0;i
学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/102159464 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:[计算机图形学经典算法] 如何处理多边形的水平边?【扫描线算法+个人解答(非官方正解)】
下一篇:Codeforces Round #590 (Div. 3), problem: (D) Distinct Characters Queries 【线段树+维护二进制】

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月23日 12时56分40秒