文章目录
这场比赛里面出到了很多 模拟的题,都是需要很多的时间去写,主要考察到了代码的实现能力,与codeforces里面的题有些差距。codeforces打多了还是有点不习惯的。题挺好的,尤其是H题感觉很考代码实现能力与STL的使用熟练度。多写写这样的题还是对我们很有好处的。只不过前三题都太水了,没有一点难度
原题链接
A.国际旅行Ⅰ
题意:
给出一段序列,求里面第k小的数
思路:
直接排序求值(没有一点难度)
代码:
cpp
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.水灵灵的学弟
题意:
博弈题,但是两个人名字一样,直接输出他们的名字就行了
思路:
没有思路,直接写
代码
cpp
void solve () {
int t;cin>>t;
while (t--) {
int x,y;cin>>x>>y;
cout<<"DHY"<<'\n'
}
}
I.重生之zbk要拿回属于他的一切
题意:
在给出的一串字符串里面找有几个"chuan"
思路:
用find函数直接找,找到了之后再往后找,直到find为-1的时候停止
代码:
cpp
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的序列,按照题意求出最小的行列式的大小
思路:
此题无方思路茫,暴力求解泪两行。
代码:
cpp
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;
}
else
cout<<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里面的东西就可以了。
代码
cpp
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它字符都一样,所以我们可以根据乘法的性质
例如这样,模拟几下,利用乘法的性质,将代码模拟出来即可,有些难度,比较难代码实现
cpp
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';
}