Gym102174 (The 14-th BIT Campus Programming Contest)
传送门:
Problem A
温暖的签到题,用个map记录一下就行了。
#include <bits/stdc++.h>
using namespace std;
string str[20];
map<string,int>mp;
int main()
{//sfreopen("in.txt","r",stdin);//1 chui 0 ximp["5--"]=1;mp["2-"]=0;mp["1-"]=1;mp["4-"]=0;mp["3-"]=1;mp["6-"]=0;mp["5-"]=1;mp["7-"]=0;mp["1"]=1;mp["2"]=0;mp["3"]=1;mp["4"]=0;mp["5"]=1;mp["6"]=0;mp["1+"]=1;mp["7"]=0;mp["3+"]=1;mp["2+"]=0;mp["5+"]=1;mp["4+"]=0;mp["1++"]=1;mp["6+"]=0;mp["3++"]=1;mp["7+"]=0;mp["0"]=-1;int n;cin>>n;for(int i=1;i<=n;i++){string str;cin>>str;if(mp[str]==-1) printf("X");else if(mp[str]==1) printf("E");else printf("I");}return 0;
}
Problem B
题意:
给你mmm个串,现在让你构建一个长度为nnn的strstrstr串,使得这mmm个串的都不是strstrstr的子串。
分析:
考虑AC自动机。
将所给的mmm个串建立AC自动机,之后我们可以考虑的一个算法是,对现在所形成的Tire图进行dfs遍历,倘若发现我们能够在这张Trie图上走nnn步,则我们就将这nnn步的结果输出即可。
但是因为在这里,状态数达到了26m26^m26m之多,如果之间对Tire图进行遍历必然会超时,故现在考虑优化。
我们发现在我们形成的Trie图中,显然是存在大量的有效环,即存在不经过EndEndEnd结点的环,而倘若遇到一个这样的环,则我们只需要直接不断经过这个环即可。如此我们就可以避免遍历大量的无效的状态。
因此我们只需要预先进行预处理,我们首先先对Trie图进行遍历,记录一下有哪些结点是能够形成环,最后我们只需要在统计答案的时候优先通过这些的结点即可。
代码:
#include <bits/stdc++.h>
#define maxn 500005
using namespace std;
char str[maxn];
int n,m;
struct Trie{int next[maxn][26],End[maxn],root,fail[maxn],id;int vis[maxn],num[maxn],ans[maxn];int newnode(){for(int i=0;i<26;i++){next[id][i]=-1;}End[id]=0,vis[id]=0,num[id]=0;return id++;}void init(){id=0;root=newnode();}void Insert(char *str){int len=strlen(str);int now=root;for(int i=0;i<len;i++){if(next[now][str[i]-'a']==-1)next[now][str[i]-'a']=newnode();now=next[now][str[i]-'a'];}End[now]++;}void build(){queue<int>que;int now=root;fail[root]=root;for(int i=0;i<26;i++){if(next[root][i]==-1){next[root][i]=root;}else{fail[next[root][i]]=root;que.push(next[root][i]);}}while(!que.empty()){now=que.front();que.pop();End[now]|=End[fail[now]];for(int i=0;i<26;i++){if(next[now][i]==-1)next[now][i]=next[fail[now]][i];else{fail[next[now][i]]=next[fail[now]][i];que.push(next[now][i]);}}}}void dfs1(int now){//预处理vis[now]=1;for(int i=0;i<26;i++){if(vis[next[now][i]]==0&&next[now][i]!=root){if(End[next[now][i]]) continue;dfs1(next[now][i]);num[now]|=num[next[now][i]];}else num[now]=1;}}int dfs2(int step,int now,int fa){if(fa!=-1) ans[step]=fa;if(step==n) return 1;for(int i=0;i<26;i++){if((!End[next[now][i]]||next[now][i]==root)&&num[next[now][i]]!=0){if(dfs2(step+1,next[now][i],i)) return 1;}}return 0;}
}ac;
int main()
{//freopen("in.txt","r",stdin);scanf("%d%d",&n,&m);ac.init();for(int i=0;i<m;i++){scanf("%s",str);ac.Insert(str);}ac.build();ac.dfs1(0);ac.dfs2(0,ac.root,-1);for(int i=1;i<=n;i++){printf("%c",ac.ans[i]+'a');}return 0;
}
Problem C
题意:
有nnn个怪兽,第iii个怪兽的血量为did_idi,攻击力为aia_iai,你的攻击力为kkk,你现在有ccc个力量果实,每吃一个力量果实都可以让你攻击力增加kkk,问你最少扣多少血。
分析:
考虑贪心,显然的贪心策略是优先嗑药秒掉那些攻击力大且血比较厚的怪物。
代码:
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
typedef long long ll;
int n,k,c;
struct Node{ll d1,x1;bool operator <(const Node&b)const{return x1>b.x1;}
}q[maxn];
int main()
{scanf("%d%d%d",&n,&k,&c);for(int i=1;i<=n;i++){scanf("%lld%lld",&q[i].d1,&q[i].x1);q[i].d1=(q[i].d1+k-1)/k-1;}sort(q+1,q+1+n);ll res=0;for(int i=1;i<=n;i++){if(q[i].d1<=c){c-=q[i].d1;continue;}else{res+=(q[i].d1-c)*q[i].x1;c=0;}}printf("%lld\n",res);return 0;
}
Problem D
Problem E
题意:
有一个大小为nnn个排列,现在你你有若干个栈以及3中操作:
- 取出序列当前的第一个数字,插入到第 ppp 个栈的顶部
- 取出第 ppp 个栈的顶部数字,插入到新序列的末尾位置
- 取出第 ppp 个栈的顶部数字,插入到第 qqq 个栈的顶部
问你最少花费多少个栈使得原排列变成升序。
分析:
不难看出可以我们最多用222个栈就可以完成上述操作。
而当且仅当形成ai−1 ai−2… a1 an…ai−2a_{i-1}~a_{i-2}\dots~a_1~a_{n}\dots a_{i-2}ai−1 ai−2… a1 an…ai−2这样的序列才能用111个栈完成。
而上述的过程,我们只需要用一个单调栈去维护即可。
代码:
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
int a[maxn];
int main()
{//freopen("in.txt","r",stdin);int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}stack<int>st;while(!st.empty()) st.pop();int minn=1;bool vis=true;for(int i=1;i<=n;i++){if(st.empty()){st.push(a[i]);continue;}while(!st.empty()&&st.top()<a[i]){if(st.top()!=minn){vis=false;break;}minn++,st.pop();}if(!vis) break;st.push(a[i]);}while(!st.empty()){if(!vis) break;if(st.top()!=minn){vis=false;break;}minn++,st.pop();}if(!vis) puts("2");else puts("1");}return 0;
}
Problem F
温暖的签到题,找一下规律就没了
代码:
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
typedef long long ll;
ll n,m;
int main()
{ios::sync_with_stdio(false);cin.tie(0);int t;cin>>t;while (t--){cin>>n>>m;ll ans=0;for (int i=1;i<=min(n,m);i++)ans+=(n-i+1)*(m-i+1)*i;cout<<ans<<endl;}return 0;
}
Problem G
Problem H
解一下方程,最后注意可能会产生增根,特判一下即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>ans;
ll a,b;
bool check(ll x){ll tmp=a*x;if (tmp<0) return 0;ll c=sqrt(tmp);if (c*c!=tmp) return 0;if (c+b==x) return 1;return 0;
}
int main(){ios::sync_with_stdio(false);cin.tie(0);int t;cin>>t;while (t--){cin>>a>>b;ll tmp=a*a+4*a*b;ll c=sqrt(tmp);if (c*c==tmp) {ll x1=a+2*b-c;ll x2=a+2*b+c;ans.clear();if (x1%2==0&&x1!=x2){x1/=2;if (check(x1)) ans.push_back(x1);}if (x2%2==0){x2/=2;if (check(x2)) ans.push_back(x2);}sort(ans.begin(),ans.end());cout<<ans.size()<<endl;cout<<ans[0];for (int i=1;i<ans.size();i++) cout<<' '<<ans[i];cout<<endl;}}return 0;
}
Problem I
Problem J
Problem K
签到题,模拟一下求导过程即可
代码:
#include <bits/stdc++.h>
using namespace std;int n,k;
const int mod=998244353;
typedef long long ll;
ll a[105];
ll Ans(ll x){ll res=1;for(int i=x,j=1;i>=1&&j<=k;i--,j++){res=res*i%mod;}return res;
}
vector<ll>res;
int main()
{scanf("%d%d",&n,&k);for(int i=1;i<=k;i++) res.push_back(0);for(int i=n;i>=1;i--){scanf("%lld",&a[i]);if(i<k) continue;else res.push_back((Ans(i)*a[i])%mod);}for(int i=0;i<res.size();i++){if(i==0) printf("%lld",res[i]);else printf(" %lld",res[i]);}return 0;
}
Problem L
Problem M
转载于:https://www.cnblogs.com/Chen-Jr/p/11007141.html
Gym102174 (The 14-th BIT Campus Programming Contest)相关推荐
- The 14-th BIT Campus Programming Contest(部分题解)
A. 两只脑斧 time limit per test1.0 s memory limit per test256 MB inputstandard input outputstandard outp ...
- 【The 13th Chinese Northeast Collegiate Programming Contest】I. Temperature Survey
题目描述 [题目链接](https://codeforces.com/gym/102220/problem/I) 给定长度为 $n$ 的 $a$ 序列,保证 $a_n \le n$,求有多少个长度为 ...
- Programming Contest Ranking(题解)
Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...
- 2019 浙江省赛部分题解(The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple)
签到题 GLucky 7 in the Pocket Time Limit: 1 Second Memory Limit: 65536 KB BaoBao loves number 7 bu ...
- Sichuan University Programming Contest 2018 Preliminary
嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...
- 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)题解
2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016) A - Artwork 题目描述: 给定N*M的网格,给出Q次 ...
- Nordic Collegiate Programming Contest 2017 题解
前几天打了一场外国人的比赛,感觉那边的题目质量还是很好的,区分度很鲜明,题目没有国内的难,坑点比较少,比较注重思维,基础算法. B题: Best Relay Team Picture by Ferna ...
- 【水一波题解】题解 of University of Central Florida 2020 (Fall) “Practice” Local Programming Contest
题解 of University of Central Florida 2020 (Fall) "Practice" Local Programming Contest [by_0 ...
- 2015 HIAST Collegiate Programming Contest J
Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...
最新文章
- MusicXML 3.0 - DTD 速查
- python xpath循环_初学Python,就用它爬取一点情话说给她听!
- pythonui自动化测试平台_django+appium实现UI自动化测试平台(开源部分,可定制开发)...
- 递归--递推之组合数
- linux内存回收 内核参数
- oracle buffercache,Oracle DBA开发之:使用sql来查看buffer cache的使用情况
- FFmpeg之wav转mp3(二十四)
- CSS 实现盒子水平垂直居中
- [转]ubuntu 终端常用命令
- 一个RSS阅读器的开源 ---- 邀请您加入开发队伍
- 玩转数据可视化之R语言ggplot2:(九)网络图绘制
- heic照片格式怎么转换jpg?heic转换成jpg方法分享
- 360抢票 网站维护中 你的登录被踢了!
- java-php-python-ssm网上拍卖系统计算机毕业设计
- 利用Python自制雷霆战机小游戏,娱乐编程,快乐学习!
- 《磨菇书三四章整理》
- [思维模式-13]:《复盘》-1- “知”篇 - 认识复盘
- 【C++面试必备】一个专栏带你搞定剑指offer第二版
- jQuery中ajax用form表单方式提交数据
- 【Java、Redis】通过中心经纬度与半径获取范围内的结果集(类似附近的人)