Codeforces Round #479 (Div. 3) 题解

总体情况

第一次见 d i v .3 非常激动,可惜星期天晚上我在学校不能打比赛.
故此我在vjudge上进行了一次vp.结果如下.
这里写图片描述
可以看到我手速还是不行,第1题时间没卡进1分钟,还吃了好几发罚时.

我的评价是:这场比赛的题目质量还是非常高的.
F题有一定的难度,我差一点就死了.

T1

按照题意模拟.手测了第一发样例,结果时间没卡进去.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{//此处快读快写略去39行,以下同
using namespace std;

int main(){
int n,k;
for (n=read(),k=read();k--;){
  if (n%10) n--;
  else n/=10;
  }
write(n);
}

T2

还是模拟并判断最大值.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
using namespace std;

map<string,int> mp;
int ans;string res;
int main(){
int n=read();
string a;cin>>a;
for (int i=0;i<a.size()-1;++i){
  char c[9];
  c[0]=a[i],c[1]=a[i+1];
  mp[c]++;
  if (mp[c]>ans) ans=mp[c],res=c;
  }
cout<<res;
}

T3

将序列排序,注意有坑.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
int n=read(),k=read(),a[yuzu|10];
int main(){
re0 i;
/*
刚好需要k个数小于或者等于x.
如果a[k]和a[k+1]相等就没有答案,反之必然有.
然后注意a[0]=1,因为答案必然在[1,1e9]之间.
这里特判了k=0的情况.
*/
for (i=1;i<=n;++i) a[i]=read();
sort(a+1,a+n+1);
if (!k) return write(a[1]==1?-1:1),0;
if (a[k]==a[k+1]) puts("-1");
else write(a[k]);
}

T4

一开始我愁眉苦脸,后来发现可以搜索.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
int n=read(),vis[105];
ll a[105],ans[105];

void dfs(int k){
if (k>n){
  for (re0 i=1;i<=n;++i) write(ans[i]),p32;
  exit(0);
  }
/*如果可以接就把后面的数接上去.反正一共100个数字.*/
for (re0 i=1;i<=n;++i) if (k==1||!vis[i]&&(a[i]==ans[k-1]*2||a[i]*3==ans[k-1])){
  ans[k]=a[i];
  vis[i]=1;
  dfs(k+1);
  vis[i]=0;
  }
}

int main(){
re0 i,j,k;
for (i=1;i<=n;++i) read(a[i]);
dfs(1);
}

T5

求无向图环数.这题目有毒.
做法就是考虑环上所有点度数都是2,然后爆搜.
这个代码WA第18个点.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
vector<int> lj[yuzu|10];
int n=read(),m=read(),ans,cnt;
fuko vis,du;

int dfs(int u){
if (du[u]^2) return 0;
vis[u]=1;
for (int i:lj[u]) if (!vis[i]){
  return dfs(i);
  }return 1;
}

int main(){
re0 i;
for (i=1;i<=m;++i){
  int u=read(),v=read();
  lj[u].push_back(v);
  lj[v].push_back(u);
  du[u]++,du[v]++;
  }
for (i=1;i<=n;++i) if (!vis[i]){
  ans+=dfs(i);
  }write(ans);
}

这个代码AC.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
vector<int> lj[yuzu|10];
int n=read(),m=read(),ans,cnt;
fuko vis,du;

int dfs(int u){
vis[u]=1;
if (du[u]^2) cnt=0;
for (int i:lj[u]) if (!vis[i]){
  dfs(i);
  }
}

int main(){
re0 i;
for (i=1;i<=m;++i){
  int u=read(),v=read();
  lj[u].push_back(v);
  lj[v].push_back(u);
  du[u]++,du[v]++;
  }
for (i=1;i<=n;++i) if (!vis[i]){
  cnt=1;
  dfs(i);
  ans+=cnt;
  }write(ans);
}

我就不懂了,区别在哪里?

T6

求最长连续上升子序列,并输出其中一组解.
首先观察Codeforces 605A Sorting Railway Cars的题解.
然后我们知道怎么去求最长连续上升子序列的长度.
605a中给定的序列一定是一个排列,但是本题中的数据范围是 10 9 .
那就上map.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
fuko a,c,pre;int n=read(),len,p;

map<int,int> pos,f,vis;

int main(){
re0 i;
memset(pre,-1,sizeof pre);//不要忘了memset为-1.
for (i=1;i<=n;++i){
  a[i]=read();
  pos[a[i]]=i;//记录a[i]本次出现的位置.
  if (vis[a[i]-1]){
    f[pos[a[i]]]=f[pos[a[i]-1]]+1;//贪心选择离这里最近的一个a[i]-1出现的位置.显然这样答案不会更劣.
    pre[i]=pos[a[i]-1];//记录一个pre.
    }
  vis[a[i]]=1;
  }
for (i=1;i<=n;++i){
  if (f[i]>len){
    len=f[i],p=i;
    }
  }
int ans=0;
if (!p){
/*
注意特判p=0,此时答案为1随意输出一个即可.
Styx大佬糊出正解然后装逼输出rand()%(n-1)+1,结果给了一个数据n=1.
*/
  printf("%d\n%d",1,1);
  return 0;
  }
write(len+1),pl;
for (;~p;p=pre[p]) c[++ans]=p;
for (i=ans;i;--i) write(c[i]),p32;
/*漂亮的递归返回.*/
}

猜你喜欢

转载自blog.csdn.net/qq_31908675/article/details/80230788