都是1800 1700一下难度较为简单的题,作为个人的积累梳理:大佬们就可以略过了!
原网站:
Div3 Round 1 http://codeforces.com/contest/977
A:
TAG: implementation 800
思路:按照题意实现即可:一个数n,你要对它进行k次操作。对于每一次操作,如果n的最后一位数字不为零,则将它减1,否则将它除以10(即删除最后一位数字)。
#include<bits/stdc++.h>
using namespace std;
int n,k;
int main()
{
cin>>n>>k;
while(k--)
{
if(n%10!=0)
{
n--;
}
else
{
n=n/10;
}
}
cout<<n<<endl;
return 0;
}
B
TAG:implementation strings 900
思路:题目要求是找出现次数最多的长度为2的子串,又题目给出的n<=100可以直接暴力,每次选定两个字符然后向后遍历求出出现多少次在比较即可
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
char s[110];
char a,b;
char x,y,maxn=0;
int main()
{
cin>>n;
cin>>s;
for(int i=0;i<=n-2;i++)
{
a=s[i];
b=s[i+1];
cnt=1;
for(int j=i+1;j<=n-2;j++)
{
if(s[j]==a&&s[j+1]==b)
{
cnt++;
}
}
if(cnt>maxn)
{
maxn=cnt;
x=a;
y=b;
}
}
cout<<x<<y<<endl;
return 0;
}
C
TAG:sortings 1200
思路:先进行排序,考虑如果k=0,那么只需要找第一位x=a[1]-1即可满足题意,但是如果a[1]=1则可以满足题目要求的数是0但是体中要求的x>1不满足需求输出-1.如果k!=0,分两种情况:1.a[k]!=a[k+1]这样直接输出x=a[k]即有k个数小于等于x可,当a[k]=a[k+1],会出现k+1个数,不满足题意所以输出-1.(题目中可以输出任意的x,菜鸟我为了方便直接找的a[k]).
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[210000];
int main()
{
cin>>n>>k;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
if(k==0)
{
if(a[1]==1)
{
cout<<-1<<endl;
}
else
{
cout<<a[1]-1<<endl;
}
}
else
{
if(a[k]==a[k+1])
{
cout<<-1<<endl;
}
else
{
cout<<a[k]<<endl;
}
}
return 0;
}
D
TAG:dfs and similar math sortings *1400
一道很好的dfs练手题:
思路:典型的枚举dfs,1.代码中我的flag指的是输出一组合法解即可,没有必要在返回上一层去找别的合法解
2.在枚举判断的时候输入的第一个数是任意的而后面的数需要进行判断.
#include<bits/stdc++.h>
using namespace std;
int n;
long long int a[110];
long long int path[110];
bool st[110];
int flag=0;
void dfs(int u)
{
if(u>n&&!flag)
{
flag=1;
for(int i=1; i<=n; i++)
{
cout<<path[i]<<" ";
}
return ;
}
for(int i=1; i<=n; i++)
{
if(!st[i])
{
if(u==1||a[i]==path[u-1]*2||a[i]*3==path[u-1])
{
st[i]=1;
path[u]=a[i];
dfs(u+1);
st[i]=0;
}
}
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
dfs(1);
cout<<endl;
}
E:
dfs and similar dsu graphs *1500
思路:1.题目中要求的环应该满足度为2这一要求。2.用vector实现邻接表存储图。3.用dfs去搜索每个点判断这些点的度是否为2。
#include<bits/stdc++.h>
using namespace std;
vector<int>g[200010];
vector<int>tu;
int vis[200010]={0};
void dfs(int x)//从x开始,开始找到所有可以联通的路径(无向图)
{
vis[x]=1;
tu.push_back(x);//储存节点
for(int i=0;i<g[x].size();i++)
{
if(!vis[g[x][i]])
{
dfs(g[x][i]);
}
}
}
int main()
{
int n,m,x,y,i,j,cnt=0;
cin>>n>>m;
for(i=0;i<m;i++)
{
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);//存储有几个联通的结点
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
tu.clear();
dfs(i);
for(j=0;j<tu.size();j++)
{
if(g[tu[j]].size()!=2)
{
break;
}
}
if(j==tu.size())
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
F:
tag:dp 1700
参考代码:https://www.luogu.com.cn/problemnew/solution/CF977F
什么,连先辈都在努力学习,我也要加油
%%%%%%%%我要是早两个月看到大佬的笔记就好了QAQ
55555 我好菜的