文章目录
- 原题链接
- A.国际旅行Ⅰ
- 题意:
- 思路:
- 代码:
- F.水灵灵的学弟
- 题意:
- 思路:
- 代码
- I.重生之zbk要拿回属于他的一切
- 题意:
- 思路:
- 代码:
- J.这是签到
- 题意:
- 思路:
- 代码:
- H.狼狼的备忘录
- 题意:
- 思路:
- 代码
- D.A*BBBB
- 题意:
- 思路:
这场比赛里面出到了很多 模拟的题,都是需要很多的时间去写,主要考察到了代码的实现能力,与codeforces里面的题有些差距。codeforces打多了还是有点不习惯的。题挺好的,尤其是H题感觉很考代码实现能力与STL的使用熟练度。多写写这样的题还是对我们很有好处的。只不过前三题都太水了,没有一点难度
原题链接
点击跳转牛客,进行奇妙冒险🐂
A.国际旅行Ⅰ
题意:
给出一段序列,求里面第k小的数
思路:
直接排序求值(没有一点难度)
代码:
void solve () {int n,m,q;cin>>n>>m>>q;for (int i=1;i<=n;i++) {cin>>a[i];}int x,y;sort(a+1,a+1+n);for (int i=1;i<=m;i++) {cin>>x>>y;}int p;for (int i=1;i<=q;i++) {cin>>p;cout<<a[p]<<'\n';}
}
接下来登场的就更是一道逆天题了
F.水灵灵的学弟
题意:
博弈题,但是两个人名字一样,直接输出他们的名字就行了
思路:
没有思路,直接写
代码
void solve () {
int t;cin>>t;
while (t--) {
int x,y;cin>>x>>y;
cout<<"DHY"<<'\n'
}
}
I.重生之zbk要拿回属于他的一切
题意:
在给出的一串字符串里面找有几个“chuan”
思路:
用find函数直接找,找到了之后再往后找,直到find为-1的时候停止
代码:
void solve () {int n;cin>>n;string s;cin>>s;int x=0,cnt=0;while (1) {x=s.find("chuan");if (x==-1) {break;}cnt++;s.erase(x,5);}cout<<cnt;
}
J.这是签到
题意:
给出n×m的序列,按照题意求出最小的行列式的大小
思路:
此题无方思路茫,暴力求解泪两行。
代码:
void solve () {int n,m;cin>>n>>m;for (int i=1;i<=n;i++) {for (int j=1;j<=m;j++) {cin>>a[i][j];}}int ma=min(n,m);int ans=INT_MAX;for (int i=1;i<=ma;i++) {if (i==1) {ans=min(a[1][1],ans);}if (i==2) {int t=a[1][1]*a[2][2]-a[1][2]*a[2][1];ans=min(ans,t);}if (i==3) {int t1=a[1][1]*a[2][2]*a[3][3]+a[1][2]*a[2][3]*a[3][1]+a[1][3]*a[2][1]*a[3][2];int t2=a[1][3]*a[2][2]*a[3][1]+a[1][1]*a[2][3]*a[3][2]+a[1][2]*a[2][1]*a[3][3];ans=min(ans,t1-t2);
// cout<<t1<<' '<<t2<<' ';}if (i==4) {int t1=a[1][1]*a[2][2]*a[3][3]*a[4][4]+a[1][2]*a[2][3]*a[4][1]*a[3][4]+a[1][4]*a[2][1]*a[3][2]*a[4][3]+a[1][3]*a[2][4]*a[3][1]*a[4][2];int t2=a[1][4]*a[2][3]*a[3][2]*a[4][1]+a[1][3]*a[2][2]*a[3][1]*a[4][4]+a[2][4]*a[3][3]*a[4][2]*a[1][1]+a[1][2]*a[2][1]*a[3][4]*a[4][3];int ans=t1-t2;ans=min(ans,t1-t2);}if (i==5) {int t1=a[1][1]*a[2][2]*a[3][3]*a[4][4]*a[5][5]+a[1][2]*a[2][3]*a[3][4]*a[4][5]*a[5][1]+a[1][3]*a[2][4]*a[3][5]*a[4][1]*a[5][2]+a[1][4]*a[2][5]*a[3][1]*a[4][2]*a[5][3]+a[1][5]*a[2][1]*a[3][2]*a[4][3]*a[5][4];int t2=a[1][5]*a[2][4]*a[3][3]*a[4][2]*a[5][1]+a[1][4]*a[2][3]*a[3][2]*a[4][1]*a[5][5]+a[1][3]*a[2][2]*a[3][1]*a[4][5]*a[5][4]+a[1][2]*a[2][1]*a[3][5]*a[4][4]*a[5][3]+a[1][1]*a[2][5]*a[3][4]*a[4][3]*a[5][2];int ans=t1-t2;ans=min(ans,t1-t2);}}if (m!=n) {if (ans>0) cout<<"0";else cout<<ans; }elsecout<<ans;
}
范围那么小,不就是留着给我暴力打表的吗
H.狼狼的备忘录
题意:
给出很多信息,给它们整理起来,最后按要求输出
思路:
用map<string,set< string > > ;将每个人的信息存入相应的数组set里面,再在set里面对不符合要求的给删掉。每个人的名字是字符串s,每个人的信息是str刚开始mp[s].size()的大小如果是零的话,一定往里面存入东西,然后里面如果不为0,就要遍历这个set,用for (auto t : mp[s]),如果t长的话,就判断str是不是为t的后缀,如果遍历完了都没有找到后缀的话,就把str存入里面,就执行mp[s].insert(str)。如果str长的话,就要把原set里面的东西选择性的删掉,那么删谁呢?就要遍历这个set找到谁是str的后缀,然后给它删掉,用erase函数是实现,最后再按要求输出map里面的东西就可以了。
代码
void solve () {map<string,set<string> >mp;int n;cin>>n;for (int i=1;i<=n;i++) {string s;cin>>s;int q;cin>>q;for (int j=1;j<=q;j++) {string str;cin>>str;int flag=1;if (mp[s].size()==0) mp[s].insert(str);else {vector<string> v;for (auto t:mp[s]) {if (t.size()>=str.size()) {int k=t.rfind(str);if (k!=-1&&k+str.size()==t.size()) flag=0; }else {int k=str.rfind(t);if (k!=-1&&k+t.size()==str.size()) v.push_back(t);}}if (flag) mp[s].insert(str);if (v.size())for (auto t : v) {mp[s].erase(t);}} }}int ans1=mp.size();cout<<ans1<<'\n';for (auto t1 : mp) {cout<<t1.fi<<' '<<mp[t1.fi].size()<<' ';for (auto t2 : mp[t1.fi]) {cout<<t2<<' ';}cout<<'\n';}}
D.A*BBBB
题意:
两个非常大的数字相乘求结果python过不了
思路:
将两个数字用字符串输入,因为b它字符都一样,所以我们可以根据乘法的性质
例如这样,模拟几下,利用乘法的性质,将代码模拟出来即可,有些难度,比较难代码实现
void solve () {string x,y;cin>>x>>y;reverse(ALL(x));string ans;int t=0,t1=0;for (int i=0;i<x.size()+y.size();i++) {if (i<x.size())t+=(x[i]-'0');if(i-y.size()>=0&&i-y.size()<x.size()) t-=(x[i-y.size()]-'0');t1+=t*(y[0]-'0');ans.push_back(t1%10+'0');t1/=10;} while (ans.size()>1&&ans.back()=='0') ans.pop_back();reverse(ALL(ans));cout<<ans<<'\n';
}