CSDN话题挑战赛第2期
参赛话题:算法题解

写一下签到和对标到区域赛铜牌级别的题目,m题大概是铜牌偏上一点吧。

A. Another A+B Problem(暴力/搜索)

猜成语游戏

题意:给一个两位正整数加两位正整数等于两位正整数的等式,然而我们对于目标等式的每个位置的数字是不确定的,可知给定的等式一共8个字符,然后对于这8个字符每一位都给定一个判定,判定有三种情况,‘G’‘P’‘B’。
‘G’:说明这个位置和目标等式相等
‘P’:说明这个位置在目标等式中存在,但却并不是这个位置
‘B’:说明这个数字在目标等式中根本不存在,或者这个位置上的数字是n,目标等式中只有x个n,前面的判定中已经有了x个对于n的P和G判定,所以这个位置对于n的判定也会为‘B’

求:所有的目标等式个数。

思路:一眼题没啥好讲的,搜索或者循环暴力来就行了。

搜索的话,在搜索之前记得对每个位置标记不可能出现的数字,标记每个数字最多出现次数限制,并且对于所有推得等式都要判定是否合法。

偷个队友的代码

#include <bits/stdc++.h>
#define int long long
#define lowbit(x) ((x)&(-x))
#define endl '\n'
using namespace std;
const int inf=1e18;
const int N = 4e6+10;
const int B=2e6;
char s[100005],f[100005];
int pos[100005][155],t;
int getnum(char c)
{if(c>='0'&&c<='9')return c-'0';return (c-'a')+10;
}
signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);cin>>t;while(t--){cin>>s+1>>f+1;int n=strlen(s+1),m=strlen(f+1);for(int i=0;i<36;i++) pos[n][i]=0;for(int i=n-1;i>=1;i--){for(int j=0;j<36;j++)pos[i][j]=pos[i+1][j];pos[i][getnum(s[i+1])]=i+1;}// for(int i=1;i<=n;i++)// {//     for(int j=0;j<36;j++)//     cout<<pos[i][j]<<" "<<i<<" "<<j<<endl;// }int minn=1e9,l=1,r=n;for(int i=1;i<=n;i++){int u=i,flag=1;if(s[i]!=f[1]) continue;for(int j=2;j<=m;j++){if(pos[u][getnum(f[j])]==0){flag=0;break;}//cout<<i<<" "<<u<<" "<<pos[u][getnum(f[j])]<<endl;u=pos[u][getnum(f[j])];}if(!flag) break;int res=u-i+1;if(minn>res){minn=res;l=i;r=u;}}for(int i=l;i<=r;i++) cout<<s[i];cout<<endl;}system("pause");return 0;
}

E.Expenditure Reduction(思维/预处理)

题意:给定模式串s和文本串t,你可以删除s的一个前缀和一个后缀来取得最短的字符串满足这个字符串中的某个子序列是文本串t

思路:
拿到这题看的时候发现好像很简单,就把每个字母出现的位置用vector一存。然后根据t的首字母出现的位置然后每次二分后面一个字母出现的位置,然后不断更新找到最短长度。后来发现会t第32样例,大概是aaaaaaaaaa这种东西。

然后想起ccpc网络赛队友秒的一个题,是把链式前向星的思想用上,然后能够做到o(n*m)的预处理和o(1)的查询。

我们设nex[i][a]为在i这个位置要寻找字符a的话,我们最近应该跳到那个位置上。

#include<bits/stdc++.h>
#define endl '\n';
using namespace std;const int N = 1e5+100;
int tt,n,m,l,r;
char s[N],t[500];
int nex[N][40];//位置i要找字符j的话最近的一个应该找谁
inline int tonum(char a)
{if(a<='9'&&a>='0')return a-'0';return a-'a'+10;
}
signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);for(cin>>tt;tt;tt--){cin>>s+1>>t+1;int n=strlen(s+1);int m=strlen(t+1);memset(nex[n],-1,sizeof(nex[n]));for(int i=n-1;i>=1;i--){for(int j=0;j<40;j++)nex[i][j]=nex[i+1][j];nex[i][tonum(s[i+1])]=i+1;}int l=1,r=n;int minn=1e9;for(int i=1,now;i<=n;i++){if(s[i]!=t[1])continue;now=i;for(int j=2;j<=m;j++){if(nex[now][tonum(t[j])]==-1)goto xx;now=nex[now][tonum(t[j])];}if(minn>now-i+1){minn=now-i+1;l=i;r=now;}}xx:;for(int i=l;i<=r;i++)cout<<s[i];cout<<endl;}return 0;
}

G.Gua(口舍匕匕)

题意不讲了,思路也不讲了,实名喷一下出题人,您英语水平是不是从小到大都是满分,所以才能出这么逆天的题面,签到题给大家找了一篇夜香?

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int inf=1e18;
const int N=7e5+5;
int B,R,D,S;void solve()
{cin>>B>>R>>D>>S;if(R==0){if(!D){cout<<"ok"<<endl;return;}else{cout<<"gua!"<<endl;return;}}int k=(R*S/60LL+1LL)*B;if(k<D)cout<<"gua!"<<endl;elsecout<<"ok"<<endl;
}
signed main()
{ios;int T;cin>>T;while(T--)solve();return 0;
}

H(并查集)
题意:一个环形数组,我们每次可以涂连续k个位置,后来涂的东西可以覆盖之前涂的东西。问你是否能涂出目标数组,能的话输出涂的次数,不能就输出-1

思路:先开二倍空间搞出换型数组,然后并查集统计每个块的大小,如果块最大都不到k那就-1,否则涂的次数就是每个块的大小除k向上取整之和。

#include <iostream>using namespace std;
const int N = 1e6+100;
int dsu[N],siz[N],a[N],maxx,n,m,k,ans,t;
int tfind(int x)
{if(x==dsu[x])return x;return dsu[x]=tfind(dsu[x]);
}
void tmerge(int x,int y)
{x=tfind(x),y=tfind(y);if(x==y)return ;dsu[y]=x;siz[x]+=siz[y];maxx=max(maxx,siz[x]);
}
int chu(int x,int d)
{if(x%d!=0)return x/d+1;return x/d;
}
int main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);for(cin>>t;t;t--){cin>>n>>m>>k;ans=0;maxx=1;for(int i=1;i<=n;i++){cin>>a[i];dsu[i]=i;siz[i]=1;}for(int i=1;i<=n-1;i++)if(a[i]==a[i+1])tmerge(i+1,i);if(a[n]==a[1])tmerge(1,n);if(maxx<k){cout<<-1<<endl;continue;}for(int i=1;i<=n;i++)if(dsu[i]==i)ans+=chu(siz[i],k);cout<<ans<<endl;}return 0;
}

N(签到,字典序)

题意:按照顺序输出两个字符串

思路:这要什么思路,,

#include<bits/stdc++.h>
using namespace std;
signed main()
{string s1,s2;cin>>s1>>s2;if(s1<s2)cout<<s1+'<'+s2;else if(s1>s2)cout<<s1+'>'+s2;elsecout<<s1+'='+s2;return 0;
}

M(思维)

题意:给定m个含有n个元素的排列,规定元素x大于y的话只需要有一个排列中有x在y前面即可。而x大于z的话又可以通过这样的步骤来得出:
1.x在某个排列里比y靠前
2.y在某个排列里比z靠前
3.所以x比z大

输出m个数,每个数代表第i个元素比多少元素大。

思路:
突破点就是每一行都是一个排列,我们知道一个排列中每个元素仅出现一次,那么我们按照列优先去遍历他给出的n列m行矩阵。

如果遍历到的矩阵的元素是第一次出现,那么我们要记录这个数,同时记录到目前为止有多少个“第一次出现”的数。

假如第一列有两个第一次出现的数是1和2,如果我们想说1和2比剩下的所有数(n-2个数)都大,那么我们就应该确保第一列和第二列不会再出现“第一次出现的数”。否则,如果第二列出现了新的“第一次出现”的数3,那么势必代表在这个3出现的哪一行里1和2中有一个跑到了第二列的3的后面,那么就可以论证3大于1也大于2。所以3就也比剩下的所有数都大。然后就继续要去遍历前三列没有新增的第一次出现的数。

具体见代码

#include<bits/stdc++.h>
using namespace std;
int n,m,vis[500005],ans[500005],num;
vector<int>a[500005];
queue<int>q;
int main()
{scanf("%d%d",&n,&m);//n列m行for(int i=1;i<=m;i++){for(int j=1,x;j<=n;j++){scanf("%d",&x);a[i].push_back(x);//第i个数列里的元素}}for(int i=0,x,las=1;i<n;i++){for(int j=1;j<=m;j++){if(!vis[a[j][i]]){vis[a[j][i]]=1;num++;q.push(a[j][i]);}}if(num==i+1){while(!q.empty()){x=q.front();q.pop();ans[x]=n-las;}las=num+1;}}for(int i=1;i<=n;i++)printf("%d ",ans[i]);return 0;
}

区域赛银牌级别题目:B C I待补

2022上海省赛(A,E,G,H,M,N)相关推荐

  1. 上海区域赛Unlock the Cell Phone

    /* 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4026  题目来源:上海区域赛Unlock the Cell Phone 报告人:SpringWa ...

  2. 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)

    蓝桥杯 2022年省赛真题(Java 大学C组) 目录 试题 A: 排列字母 试题 B: 特殊时间 试题 C: 纸张尺寸 试题 D: 求和 试题 E: 矩形拼接 试题 F: 选数异或 试题 G: GC ...

  3. 2021CCPC上海省赛题解ABCDEGHIJK

    2021CCPC上海省赛题解ABCDEGHIJK A. 小 A 的点面论 题意 给定两相异的非零向量(x1,y1,z1),(x2,y2,z2)(0≤xi,yi,zi≤10)(x_1,y_1,z_1), ...

  4. 暨阳学院2022年绍兴市赛校内选拔赛(题解)

    暨阳学院2022年绍兴市赛校内选拔赛(题解) A. 思路: 简单dp,枚举每个补给站选和不选两种情况. 代码: #include<bits/stdc++.h> using namespac ...

  5. 2022年天梯赛校内选拔赛(1)

    2022年天梯赛校内选拔赛(1) 7-1 暴力破解 (15 分) 题目描述 代码 7-2 学霸 (20 分) 题目描述 代码 思路 7-3 排课 (20 分) 题目描述 代码 7-4 简易测谎 (20 ...

  6. 2021ICPC上海区域赛DEGKI

    题目链接: https://codeforces.com/gym/103446 视频讲解: https://www.bilibili.com/video/bv1994y1f76o 代码:https:/ ...

  7. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...

  9. ICPC网络赛第二场G Limit

    ICPC网络赛第二场G Limit 题意: 给你数组a和b,求解: 1≤n≤100000,−100≤ai,bi≤100,0≤t≤5.1≤n≤100000,−100≤a_{i},b_{i}≤100,0≤ ...

最新文章

  1. win7安装redis
  2. GPU 共享内存bank冲突(shared memory bank conflicts)
  3. html图片分开,webpack单独分离打包css,css里引用的图片路径错误,怎么解决?
  4. form 窗体增加边框_C#控件美化之路(13):美化Form窗口(上)
  5. Android中LocalSocket使用
  6. 理解Java对象序列化——Serializable接口
  7. SCN风波又起,2019年6月之前Oracle必须升级吗?
  8. 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
  9. Android and Apple 投屏至linux电脑
  10. 删除oracle 连接进程,如何查看和清除oracle无用的连接进程
  11. Android 来电自动接听
  12. linux mpeg4ip 编译,利用Linux实现MPEG4流媒体技术
  13. JS 如何实现获取本地文件夹名称
  14. mac版android sdk安装手机模拟器
  15. 医学统计学笔记之设计
  16. Percentile Ranks Aggregation
  17. 机器学习—分类算法的对比实验
  18. res资源文件学习之res/values/attr.xml
  19. CSS line-height 三种赋值方式有何区别 (琐碎知识点整理)
  20. 软件工程大作业进度报告

热门文章

  1. 线性代数(九) : 矩阵的行简化阶梯型和标准型
  2. 基础sql语句的编写,学会这些sql语句的编写一般情况都够用,适合初学者
  3. 甜心奶酪用英文怎么说_您组织中没有人会碰到什么奶酪,更不用说动弹了?
  4. Nature子刊 | 褚海燕组-土壤生物多样性与城市绿地生态系统功能(朱永官/韦革宏点评)...
  5. 2021会同一中高考成绩查询,2021年怀化高考状元是谁分数多少分,历年怀化高考状元名单...
  6. 三菱编程软件GX Works2
  7. 科目二上车前的基础说明
  8. btrace 开源!基于 Systrace 高性能 Trace 工具
  9. Promethes监控华为S5720交换机
  10. Android动画(翻牌抽奖)