A 挑战密室

化学方程式求分子量

这题我懒得写了

可以用map<string,int>哈希表,表示每种分子的相对分子质量

之后,从头遍历到尾。

1.数字:连读直到不是数字

2.字母:连读直到不是字母

3.括号:从左括号开始遍历,重复1、2,到右括号退出

下面这个代码可以AC,但是有bug的,数字超过10,或者字母连着>3个就挂了

#include<cstdio>
#include<cstring>
#include<map>
#include<string>
using namespace std;
map<string,int> x;
int main()
{
x["N"]=14;x["C"]=12;x["O"]=16;x["Cl"]=35;x["S"]=32;x["H"]=2;x["Al"]=27;x["Ca"]=40;x["Zn"]=65;x["Na"]=23;
int t;scanf("%d",&t);
char ch[52],xx[3];
while (t--)
{
int i;
scanf("%s",ch);int ll=strlen(ch);
for (i=0;i<ll;i++)
if (ch[i]=='=')
break;
int lplp=1;
i++;int s,ss=0,ks;
if ('0'<ch[i]&&ch[i]<='9')
{
lplp=ch[i]-'0';
i++;
}
for (;i<ll;i++)
{
if (ch[i]=='+')
break;
if (ch[i]=='(')
{
s=0;i++;
for (;;i++)
{
if (ch[i]==')') break;
if ('A'<=ch[i]&&ch[i]<='Z')
{
xx[0]=ch[i];
xx[1]=0;
if ('a'<=ch[i+1]&&ch[i+1]<='z')
{
i++;
xx[1]=ch[i];
xx[2]=0;
}
}
ks=x[xx];
if ('0'<ch[i+1]&&ch[i+1]<='9')
{
i++;
ks*=ch[i]-'0';
}
s+=ks;
}
if ('0'<ch[i+1]&&ch[i+1]<='9')
{
i++;
s*=ch[i]-'0';
}
ss+=s;
}
else
{
if ('A'<=ch[i]&&ch[i]<='Z')
{
xx[0]=ch[i];
xx[1]=0;
if ('a'<=ch[i+1]&&ch[i+1]<='z')
{
i++;
xx[1]=ch[i];
xx[2]=0;
}
}
ks=x[xx];
if ('0'<ch[i+1]&&ch[i+1]<='9')
{
i++;
ks*=ch[i]-'0';
}
ss+=ks;
}
}
ss*=lplp;
printf("%04d\n",ss);
}
return 0;
}

B 最大岛屿

dfs统计连通分量模板

void dfs(int x,int y){
flood[x][y] = area;
for(int i=0;i<8;i++){
int tx = x + dr[i][0];
int ty = y + dr[i][1];
if(in(tx,ty) && a[tx][ty] == 1 && flood[tx][ty] == 0){
dfs(tx,ty);
}
}
}

主要注意地图的读写,中间有空格,可以用getchar读取

#include<bits/stdc++.h>
using namespace std; const int maxn = 510;
int m,n,t;
int a[maxn][maxn];
int area = 0;
int flood[maxn][maxn];
int dr[8][2] = {{0,1},{0,-1},{-1,0},{1,0},{1,-1},{-1,1},{-1,-1},{1,1}};
int s[maxn*maxn]; bool in(int x,int y){
return x>=1 && x<=n && y>=1 && y<=m;
} void dfs(int x,int y){
flood[x][y] = area;
for(int i=0;i<8;i++){
int tx = x + dr[i][0];
int ty = y + dr[i][1];
if(in(tx,ty) && a[tx][ty] == 1 && flood[tx][ty] == 0){
dfs(tx,ty);
}
}
} int main(){
cin>>n>>m>>t;
getchar();
char ch;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
while((ch = getchar()) == ' '){}
a[i][j] = ch - '0';
}
getchar();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(flood[i][j] == 0 && a[i][j] == 1){
area++;
dfs(i,j);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(flood[i][j] != 0){
s[flood[i][j]]++;
}
}
}
long long maxarea = 0;
for(int i=1;i<=area;i++){
if(s[i] > maxarea) maxarea = s[i];
}
cout<<area<<" "<<maxarea*t<<endl;
return 0;
}

C 最少换乘

写bfs搜索(求最短路)过的

首先把所有与起点1同一路线的点都入队(step表示换成次数 = 0)

bfs每次取出头部,搜索

当两点时同一公交路线时,新状态step不变

当两点不是同一公交路线时,新状态step+1

vis二维数组标记这条边是否走过

另外注意:这道题读入比较麻烦

没有告诉我们 每行有多少个数

我用getline函数来读的,getline(std::cin,string),读入到字符串string中

其他博客写的题解,用单源点最短路dijkstra做的 https://blog.csdn.net/dreamlandz/article/details/51509382

#include<bits/stdc++.h>
using namespace std; const int maxn = 510;
int g[maxn][maxn];
int t;
int n,m;
int a[maxn];
int vis[maxn][maxn];
struct edge{
int u;
int w;
edge(int uu = 0,int ww = 0){
u = uu;
w = ww;
}
};
vector<edge> v[maxn];
int sstation;
int estation;
struct node{
int xx;
int station;
int step;
node(int xxx,int stations,int steps){
xx = xxx;
station = stations;
step = steps;
}
}; int bfs(){
queue<node> q;
// q.push(node(1,3,0)); //这里应该把和a相连的全部入队 就是下面几行
for(int i=0;i<v[1].size();i++){
vis[1][v[1][i].u]= 1;
q.push(node(v[1][i].u,v[1][i].w,0));
}
int ans = 0x3f3f3f3f;
while(!q.empty()){
int x = q.front().xx;
int sta = q.front().station;
int step = q.front().step;
if(x==n){
ans = min(ans,step);
}
q.pop();
for(int i=0;i<v[x].size();i++){
if(vis[x][v[x][i].u]) continue;
if(v[x][i].w == sta){
vis[x][v[x][i].u] = 1;
q.push(node(v[x][i].u,sta,step));
}else{
vis[x][v[x][i].u] = 1;
q.push(node(v[x][i].u,v[x][i].w,step+1));
}
}
}
return ans;
} int main(){
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
cin>>m>>n;
getchar();
for(int i=1;i<=m;i++){
string temp;
getline(std::cin, temp);
int len = 0;
for(int j=0;j<temp.length();j++){
int sum = 0;
while(j < temp.length() && temp[j] != ' '){
sum = sum*10 + (temp[j] - '0');
j++;
}
a[len++] = sum;
}
for(int j=0;j<len;j++){
for(int p = j+1;p<len;p++){
v[a[j]].push_back(edge(a[p],i));
}
}
}
int ans = 0;
ans = bfs();
if(ans == 0x3f3f3f3f){
cout<<"NO"<<endl;
}else{
cout<<ans<<endl;
}
for(int i=0;i<maxn-1;i++){
v[i].clear();
}
}
return 0;
}

D 引水工程

最小生成树,prim和kru...都可以过

kru最小生成树

建图时 自己对自己也算一条边(如果要选条边,不能算n-1条边里)

#include<bits/stdc++.h>
using namespace std; /*
想法1:
kru最小生成树
建图时 自己对自己也算一条边(如果要选条边,不能算n-1条边里)
*/ /*
想法2:从权值最小的开始建水库 prim算法
*/ //kru做法
int n,m,minn,father[305],sum,tem[305];
struct node
{
int x,y,l;
}a[90005]; bool cmp(node a,node b)
{
return a.l<b.l;
} int find(int x) // 做了时间上的优化 ,但是 在空间复杂度上比较高
{
if(x!=father[x])
father[x]=find(father[x]);
sum++;
return father[x];
} bool merge(int x,int y) // 做了时间复杂度上的优化 让并查集的 深度尽量 浅
{
int sum1,sum2;
sum=0;
x=find(x);
sum1=sum; // x 的深度
sum=0;
y=find(y);
sum2=sum; // y 的深度
if(x!=y)
{
if(sum1>sum2)
father[y]=x;
else
father[x]=y;
return true;
}
else
return false;
}
int main() // 先用 Dijkstra 做一次 // Dijkstra 是 根据边来做的
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<=n;i++)
father[i]=i;
int q=0;
//i从0开始 多输了一次
for(int i=0;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int e;
scanf("%d",&e);
a[q].x=j;
a[q].y=i;
a[q].l=e;
q++;
}
}
int sum3=0,count1=0;
sort(a,a+q,cmp);
for(int i=0;i<q;i++)
{
if(merge(a[i].x,a[i].y))
{
sum3+=a[i].l;
count1++;
}
if(count1==n) // 如果边数等于 所有需要连接的 点数-1的话 就跳出去
break;
}
printf("%d\n",sum3);
}
return 0;
}

Prim求最小生成树

在选择最小邻接边时,和顶点再比较一下

#include<bits/stdc++.h>
using namespace std; const int inf = 0x3f3f3f3f;
const int maxn = 510;
bool vis[maxn];
int dist[maxn];
int g[maxn][maxn];
int a[maxn];
int n,t; //想法2:从权值最小的开始建水库 prim算法
//有水可以自身引水 或者其它地区引水 所以如果 最小的邻接边的费用 比对应顶点的权值大 就自己引水 int Prim(int pos){
int ans = 0;
memset(vis,false,sizeof(vis));
ans = a[pos];
vis[pos] = true;
for(int i=1;i<=n;i++) dist[i] = g[pos][i];
for(int i=1;i<=n-1;i++){
int minc = inf;
int p = -1;
for(int j=1;j<=n;j++){
if(!vis[j] && minc > dist[j]){
minc = dist[j];
p = j;
}
}
//应题目中的要求(每个点都要有水)
//有水可以自身引水 或者其它地区引水 所以如果 最小的邻接边的费用 比对应顶点的权值大 就自己引水
if(minc > a[p]){
ans += a[p];
vis[p] = true;
continue;
} vis[p] = true;
ans += dist[p];
for(int j=1;j<=n;j++){
if(!vis[j] && dist[j] > g[p][j]){
dist[j] = g[p][j];
}
}
}
return ans;
} int main(){
cin>>t;
while(t--){
cin>>n;
int minv = inf;
int pos = 1;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i] < minv){
minv = a[i];
pos = i;
}
} for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>g[i][j];
}
}
cout<<Prim(pos)<<endl;
}
return 0;
}

F Distribution

校赛也出了这一道题,比较简单

给定两条线,求一三象限 与 二四象限 上的 点数差

#include<bits/stdc++.h>
using namespace std; const int maxn = 1100;
int n,m;
int g[maxn][maxn]; // 0开始(0也算)
int maxx = 0;
int maxy = 0; int solve(int x,int y){
int sum = 0;
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
if(g[i][j] == 1)
sum++;
}
}
for(int i=x+1;i<=maxx+1;i++){
for(int j=y+1;j<=maxy+1;j++){
if(g[i][j] == 1)
sum++;
}
}
return sum;
} int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int xi,yi;
cin>>xi>>yi;
g[xi][yi] = 1;
if(xi > maxx) maxx = xi;
if(yi > maxy) maxy = yi;
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
int ans1 = 0;
int ans2 = 0;
ans1 = solve(x,y);
ans2 = n - ans1;
cout<<ans1 - ans2<<endl;
}
return 0;
}

G Interference Signal

题意:给定n个数,求最大的 至少连续m个数的平均值

枚举起点,算平均值就可以了

#include<bits/stdc++.h>
using namespace std; const int maxn = 2050;
int t;
int a[maxn];
int sum[maxn];
int n,m; int main(){
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i] = a[i] * 1000;
}
memset(sum,0,sizeof(sum));
sum[0] = 0;
for(int i=1;i<=n;i++){
sum[i] = sum[i-1] + a[i];
}
double average = 0;
for(int i=1;i<=n;i++){
for(int j=i+m-1;j<=n;j++){
double avetemp = (sum[j] - sum[i-1])*1.0/ (j-i+1);
if(avetemp > average) average = avetemp;
}
}
int ans = average;
printf("%d\n",ans);
}
return 0;
}

每天一套题打卡|河南省第八届ACM/ICPC的更多相关文章

  1. 每天一套题打卡|河南省第十届ACM/ICPC

    A.谍报分析 题意:请你编程,快速统计出频率高的前十个单词. 思路:字符串输入,map哈希表map<string,int >记录每个单词出现的次数,pair重载优先级 #include&l ...

  2. 每天一套题打卡|河南省第十一届ACM/ICPC

    A 计划日 题意:已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 模拟日期计算: 计算星期可以用基姆拉尔森公式 //中国 ...

  3. 每天一套题打卡|河南省第七届ACM/ICPC

    A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][ ...

  4. 每天一套题打卡|河南省第九届ACM/ICPC

    A 表达式求值 表达式求值:可以用递归求解,也可以用栈模拟,考过多次. 类似题目:NYOJ305,NYOJ35 用栈模拟做法: #include <stdio.h> #include &l ...

  5. 河南省第八届ACM省赛---引水工程

    引水工程 时间限制:2000 ms  |  内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...

  6. nyoj 1239 引水project (河南省第八届acm程序设计大赛)

    题目1239 pid=1239" style="color:rgb(55,119,188)">题目信息 pid=1239" style="col ...

  7. nyoj1237 最大岛屿(河南省第八届acm程序设计大赛)

    题目1237 pid=1237" style="color:rgb(55,119,188)">题目信息 执行结果 本题排行 讨论区 最大岛屿 时间限制:1000 m ...

  8. nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)

    题目1238 题目信息 执行结果 本题排行 pid=1238" style="text-decoration:none; color:rgb(55,119,188)"&g ...

  9. 河南省第八届ACM程序设计大赛总结

    简单的对这次省赛做个总结:总体来说这个比赛过程中做的还算比较顺利,虽然中间多多少少遇到一些坑,正式比赛开始后,我们就开始找水题,当然了我首先把英文题目翻译了一遍,发现了一道水题,这道题目其实就是判断点 ...

随机推荐

  1. 巡风扫描器web界面工作流程

    这两周学习了巡风扫描器的搭建,也在学长的带领下看了各部分的下源代码,为了加深记忆,梳理一下巡风大体的工作流程,主要通过web端的页面分析,错误的地方还请大佬们多多指正. 整体看一下巡风的扫描流程:登陆 ...

  2. CF1010D Mars rover

    CF1010D Mars rover 洛谷评测传送门 题目描述 Natasha travels around Mars in the Mars rover. But suddenly it broke ...

  3. CF798D Mike and distribution

    CF798D Mike and distribution 洛谷评测传送门 题目描述 Mike has always been thinking about the harshness of socia ...

  4. window.location.href方式提交json数据

    ${ctx}/vehicleFlow/to_vehflow_detail.do?strJson="+encodeURIComponent(json)

  5. gitbook 入门教程之解决windows热加载失败问题

    破镜如何贴花黄 gitbook 在 Windows 系统无法热加载,总是报错! gitbook 是一款文档编写利器,可以方便地 markdown 输出成美观优雅的 html ,gitbook serv ...

  6. ESP8266 LUA脚本语言开发: 外设篇-定时器,延时,看门狗

    https://nodemcu.readthedocs.io/en/master/modules/tmr/ local mytimer1 = tmr.create() function TimeFun ...

  7. P1验证性内容

    #include<stdio.h> int main() { printf("201983270555"); return 0; } #include<stdio ...

  8. 【12月13日】A股ROE最高排名

    个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名 中公教育(SZ002607) - ROE_TTM:92.66% - ...

  9. ShellScript值传递参数

    Shell传递参数 ######################################摘自菜鸟教程:http://www.runoob.com/linux/linux-shell-passi ...

  10. CentOS7安装Oracle 11g数据库

    转载:https://blog.csdn.net/lia17/article/details/82256565 rpm -ivh --force --nodeps *.rpm 强制装 rpm依赖包下载 ...