DEF题比较难一些,目前本菜鸡能力有限。

文章目录

  • A-Race
  • B-Min Value
  • C-Coronavirus
  • G-OXR
  • H-Maze
  • I-Prime
  • J-Compare
  • K-Walk
  • L-Defeat the monster

A-Race

题解:
我们可以看到数据量并不是很大,所以我们可以选择一秒钟一秒钟来对这个比赛进行分析
在每一秒中
要判断
1.是否有人到达终点
2.小明与小红之间的距离

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e6+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;int main()
{int va,vr,t,s,l;cin>>va>>vr>>t>>s>>l;int ming=0,hong=0;int cnt=0;while(true){if(hong>=l&&ming>=l){cout<<"Tie "<<cnt<<endl;break;}else if(hong>=l&&ming<l){cout<<"Hong "<<cnt<<endl;break;}else if(hong<l&&ming>=l){cout<<"Ming "<<cnt<<endl;break;}if(ming-hong>=t){int zz=0;while(zz<s){zz++;cnt++;hong+=vr;if(hong>=l){cout<<"Hong "<<cnt<<endl;return 0;}}}cnt++;hong+=vr;ming+=va;}return 0;
}

B-Min Value

题解:
这个题他要求数组内相加差值最小的数,我的思路是排序+双指针。
但是这个双指针的内部操作有几点是要注意的。
1.排序:如何排序?
我们先按照元素大小进行排序,再按照其下表进行排序,为什么第二点要按照下标进行排序,后面我会说一下。
2.双指针:
首先我们用l指针指向排好序的第一个元素,再用r指针指向排好序的最后一个元素。
之后我们不断的从两边往中间夹。
(1)首先我们把元素相加的绝对值给算出来,看看他是不是目前最小的,如果不是就更新当前最小及其下标之和,如果跟当前最小值相等的话,那么就检查一下看看是否可以更新下表之和的最小值。
(2)如何判断该移动哪个指针呢。
如果两者之和小于0那么我们就把左指针往右移动
如果两者之和大于0那么我们就把右指针往左移动

下面我们看一个样例:

5
-1 -1 0 1 1

这个样例该如何移动?
我们前面排序的方法是如果元素值相同就按照其下表进行排序
所以如果相加等于0,那么我们只需要把右指针往左移动即可,因为只有把右指针往左移动,才能减少其下表最小值

重点:
那么我们再看题目给的样例

5
-2 6 7 7 -8

我们发现排好序后是,下面的数代表他的初始下表

-8 -2 6 7 7
5   1 2 3 4

很明显-8跟到数第二个7组合会得到最优解。
既然这样的话,我们就根本不需要特判左端点元素值+右端点元素值相等的时候在移动右端点,有可能元素和最优解并不是的0,所以在判断如何移动的时候,我们先进行判断右端点是否跟右端点-1的值相同,如果相同就移动右端点,因为越靠左边下标越小
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
struct wazxy{int val,pos;
}a[maxn];
struct rule{bool operator()(const wazxy & a,const wazxy & b){if(a.val!=b.val) return a.val<b.val;else return a.pos<b.pos;}
};
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){scanf("%d",&a[i].val);a[i].pos=i;}sort(a+1,a+n+1,rule());int l=1,r=n;int imin=MaxN,ans;while(l<r){//cout<<"L:"<<l<<" "<<r<<endl;int sum=abs(a[l].val+a[r].val);if(sum<imin) imin=sum,ans=a[l].pos+a[r].pos;else if(sum==imin) ans=min(ans,a[l].pos+a[r].pos);if(a[r].val==a[r-1].val)  r--;else if(a[l].val+a[r].val>=0)  r--;else if(a[l].val+a[r].val<0) l++;}cout<<imin<<" "<<ans<<endl;return 0;}

C-Coronavirus

题解:
简单的bfs,我们可以将高位地段周围的八个区域全都给标记为不能走的区域,其实就相当于放上了一堵墙,不过这个放墙的过程可真谓是坑多多。
1.假如你把它旁边的墙标记为‘’,那你样例都过不了,因为隔壁的‘’还会被当成新的一个危险区域,并且扩散至周围。。
2.所以你应该把它周围的换一种标价来标。
3.接着第二个问题,如果你直接把他周围的地区给标记为你自己设置的符号,那如果周围也是一个危险区域,你直接把这个危险区域覆盖住了,这也是不可以的,所以需要判断周围的符号是不是‘*’,如果是的话就不需要标记了。
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 55;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
char a[maxn][maxn];
bool visited[maxn][maxn];
int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
bool flag=false;
int mins;
struct wazxy{int x,y,steps;wazxy(int a,int b,int c){x=a,y=b,steps=c;}
};bool bfs(int x,int y){queue<wazxy> q;visited[x][y]=true;q.push(wazxy(x,y,0));while(!q.empty()){//cout<<"de"<<endl;wazxy temp=q.front();q.pop();if(a[temp.x][temp.y]=='E'){mins=temp.steps;return true;}for(int i=0;i<4;i++){int nx=temp.x+dx[i];int ny=temp.y+dy[i];if((a[nx][ny]=='.'||a[nx][ny]=='E')&&!visited[nx][ny]){visited[nx][ny]=true;q.push(wazxy(nx,ny,temp.steps+1));}}}return false;
}int main()
{cin>>n>>m;memset(a,-1,sizeof(a));memset(visited,false,sizeof(visited));for(int i=1;i<=n;i++){scanf("%s",a[i]+1);}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]=='*'){if(a[i+1][j]!='*')a[i+1][j]=-1;if(a[i][j+1]!='*')a[i][j+1]=-1;if(a[i-1][j]!='*')a[i-1][j]=-1;if(a[i][j-1]!='*')a[i][j-1]=-1;if(a[i+1][j-1]!='*')a[i+1][j-1]=-1;if(a[i+1][j+1]!='*')a[i+1][j+1]=-1;if(a[i-1][j+1]!='*')a[i-1][j+1]=-1;if(a[i-1][j-1]!='*')a[i-1][j-1]=-1;}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]=='E') flag=true;}}if(flag==false){cout<<"Impossible"<<endl;return 0;}//cout<<"de"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]=='S')flag=bfs(i,j);}}if(flag) cout<<mins<<endl;else cout<<"Impossible"<<endl;return 0;
}

G-OXR

思维题
题解:
因为是异或的计算
我们假设输入了一个10
它对应的二进制是:
1010
那么1-10来说,一共有10中对应的二进制
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
总有一个二进制数可以补齐1010 中0的位置
所以我们直接将1010补位1111输出对应的十进制即可
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 55;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;int main()
{long long n;cin>>n;if(n==1){cout<<0<<endl;return 0;}long long x=1;while(x<=n){x*=2;}cout<<x-1<<endl;return 0;
}

H-Maze

题解:
数据范围式1e7所以感觉尽量还是用一下欧拉筛吧,毕竟时间复杂度越低越好。
用visited数组记录,我们用前缀和来处理一下前i个数的质数个数,之后再O(1)的复杂度情况下即可查出。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e7;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
bool visited[maxn+10];
int prim[1000000+5];
int ans[maxn+10];
void ispirm(){int cnt=0;memset(visited,true,sizeof(visited));for(int i=2;i<=maxn;i++){if(visited[i]) prim[cnt++]=i;for(int j=0;j<cnt&&prim[j]*i<=maxn;j++){visited[prim[j]*i]=false;if(i%prim[j]==0) break;}}
}
int main()
{ispirm();int t;cin>>t;for(int i=2;i<=maxn;i++){ans[i]=ans[i-1]+visited[i];}while(t--){int x,y;scanf("%d%d",&x,&y);printf("%d\n",ans[y]-ans[x-1]);}return 0;
}

I-Prime

题解:
数据范围式1e7所以感觉尽量还是用一下欧拉筛吧,毕竟时间复杂度越低越好。
用visited数组记录,我们用前缀和来处理一下前i个数的质数个数,之后再O(1)的复杂度情况下即可查出。
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e7;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
bool visited[maxn+10];
int prim[1000000+5];
int ans[maxn+10];
void ispirm(){int cnt=0;memset(visited,true,sizeof(visited));for(int i=2;i<=maxn;i++){if(visited[i]) prim[cnt++]=i;for(int j=0;j<cnt&&prim[j]*i<=maxn;j++){visited[prim[j]*i]=false;if(i%prim[j]==0) break;}}
}
int main()
{ispirm();int t;cin>>t;for(int i=2;i<=maxn;i++){ans[i]=ans[i-1]+visited[i];}while(t--){int x,y;scanf("%d%d",&x,&y);printf("%d\n",ans[y]-ans[x-1]);}return 0;
}

J-Compare

题解:
模拟水题。
1.首先先判断他的位数。
2.如果位数相同的话,我们就可以从头道尾进行比较了,正好string类的比较方式跟这个是相同的。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e6+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;string a,b;
int main()
{cin>>a>>b;if(a.size()>b.size()) cout<<">"<<endl;else if(a.size()==b.size()){if(a>b) cout<<">"<<endl;else if(a<b) cout<<"<"<<endl;else cout<<"="<<endl;}else if(a.size()<b.size()) cout<<"<"<<endl;return 0;
}

K-Walk

题解:
这个路径的最短方法也就是跟高中学过的排列组合公式一样,但是目前的问题是这个数字十分大,应该如何解决呢?
当然是逆元的思想了。
拿了我之前博客的一张图,这个是结论(菜鸡我就直接用了)
所以C(m+n-2,n-1)
比如说C(5,2)
=(5×4)/(2×1)
=(5×4×3×2×1)/(3×2×1×2×1)
所以得出以下结论:

fac[n]*quick(fac[n-m],mod-2)%mod*quick(fac[m],mod-2)%mod;

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e6+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9+7;
using namespace std;int fac[maxn];
int quick(int a,int n){int res=1;while(n){if(n&1) res=1ll*a*res%mod;a=1ll*a*a%mod;n>>=1;}return res;
}int C(int n,int m){return 1ll*fac[n]*quick(fac[n-m],mod-2)%mod*quick(fac[m],mod-2)%mod;
}int main()
{fac[0]=1;for(int i=1;i<=1000000+5;i++){fac[i]=1ll*fac[i-1]*i%mod;}int t;cin>>t;while(t--){int n,m;scanf("%d%d",&n,&m);printf("%d\n",C(n+m-2,n-1));}return 0;
}

L-Defeat the monster

题解:
我们可以先把他按照能力值水平由小到大进行排序,在进行双指针操作,我们每次都让右指针每次都移动,如果相差大于5的话我们就把左指针往右移动一下,并且如果(右指针指针指向的数-左指针指向的数)小于5的话,我们需要更新一下之间的差值。
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;int a[maxn];
int main()
{int n;cin>>n;for(int i=0;i<n;i++) scanf("%d",&a[i]);sort(a,a+n);int ans=0,l=0;for(int i=0;i<n;i++){if(a[i]-a[l]<=5){ans=max(ans,i-l+1);}else l++;}cout<<ans<<endl;return 0;
}

哈尔滨理工大学软件与微电子学院程序设计竞赛 题解相关推荐

  1. 哈尔滨理工大学软件与微电子学院程序设计竞赛 H.Maze

    哈尔滨理工大学软件与微电子学院程序设计竞赛 H.Maze 题目链接 题目描述 多多在一个N行M列的迷宫中,迷宫只由符号 '+' 或 '-' 组成.如果多多在 '+' 上,下一步只能走到上.下.左.右四 ...

  2. 哈尔滨理工大学软件与微电子学院程序设计竞赛(新生赛)

    关于哈尔滨理工大学软件与微电子学院程序设计竞赛(新生赛) 下午五点四十开始的比赛,五点二十我才刚刚抽完血,实在是有点难顶,再加上还没有吃饭,刚开始做题的时候还真是有点发懵,胳膊也很难受. 这应该是我第 ...

  3. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)B.Min Value

    哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)B.Min Value 题目链接 题目描述 有一天,老师告诉多多:绝对值是指一个数在数轴上所对应点到原点的距离. 接下来老师给多多一个由 N 个数组 ...

  4. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)(重现赛)

    比赛地址 A. 思路:模拟 #include<iostream> #include<cstring> #include<cstdio> #include<al ...

  5. 哈尔滨理工大学软件与微电子学院程序设计竞赛——C.Coronavirus【BFS】

    题目传送门 题解 直接BFS跑一遍即可 水题 AC-Code #include <bits/stdc++.h> using namespace std;const int maxn = 1 ...

  6. 哈尔滨理工大学软件与微电子学院程序设计竞赛(19级新生赛)——题解

    注:所有题目不要求多组输入 索引: A. 小乐乐学编程 B. 小乐乐算平均分 C. 小乐乐找最大数 D. 小乐乐是否被叫家长 E. 小乐乐转换成绩 F. 小乐乐算多少人被请家长 G. 小乐乐算最高分 ...

  7. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛) A

    文章目录 Race 题解 代码 模拟时间 模拟距离 Race 题解 模拟. 可以模拟时间增加,也可以模拟距离变化,本质是一样的. 之前看到了公倍数的条件,但是没用到,看了大佬代码之后恍然大悟hhhh ...

  8. 哈尔滨理工大学软件与微电子学院程序设计竞赛(新生赛) -补档

    time:2019.11.08 题目较多,所以使用目录. 文章目录 Problem A:[NowCoder54536 小乐乐学编程](https://ac.nowcoder.com/acm/probl ...

  9. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛) H

    Maze 题解 DFS/BFS. 这里用的是 D F S DFS DFS.其中有并查集的思想. 题目所求为某个格子最多能到达的格子的数量,那么如果格子A可以到达格子B,则格子B必定能到格子A. 也就是 ...

最新文章

  1. linux mysql 5.6.24_Mysql实例Linux安装MySQL5.6.24使用文字说明
  2. Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)...
  3. nodejs模块hashmap
  4. [No0000105]java sdk 开发环境变量powershell 自动配置脚本
  5. k3 审核流程图_金蝶K3系统操作流程图
  6. 游戏对战平台编写流程
  7. 光纤配线柜如何选择,又该怎么安装?
  8. 短信发送中文数据到手机显示乱码
  9. 图片情感识别/分类/分析 概述
  10. Verilog语言基础
  11. div css切图在线
  12. CC00027.kylin——|HadoopOLAP_Kylin.V27|——|Kylin.v27|Kylin构建Cube|实时OLAP.V3|
  13. 海贼王经典语录(转)
  14. 一键式打造DAO,M-DAO或成Web3新宠儿
  15. oracle rid,db2 的rid 扫描 类似于 oracle的 rowid 扫描
  16. 让数字预失真的故障排除和微调不再难 必备攻略请查收
  17. html5仿蚂蚁森林效果代码,vue仿支付宝蚂蚁森林水滴
  18. android 获取当前系统选择的语言
  19. i5 10400F处理器性能怎么样
  20. Raiffeisen银行联手俄罗斯天然气公司发行区块链银行担保

热门文章

  1. TCP连接管理【三次握手-四次挥手】
  2. 网络工程师_想要记录下来的一些题_2
  3. 彩色图像到灰度转换 常见方法汇总与对比
  4. 教程 | OpenCV深度神经网络实现人体姿态评估
  5. 笔记 | PyTorch安装及入门教程
  6. 图像处理之目标检测入门总结
  7. 雇佣和留住开发人员,打造优秀的团队
  8. 前端见微知著工具篇:Bower组件管控
  9. 前后台使用ajax传list的时候,用value[] 获取值
  10. 【JavsScript】推荐五款流行的JavaScript模板引擎