A
Codeforces Round #173 (Div. 2), problem: (A) Bit++
题目大意
模拟 我们平常写代码的++x 和- -x 或者x++ x- -
题解
容易发现,每个字符串的区别就在于第2位,要么 + ,要么 - 只需要判断一下就好了
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>n){
int ans=0;
string s;
for(int i=0;i<n;i++){
cin>>s;
if(s[1]=='+')
++ans;
if(s[1]=='-')
--ans;
}
cout<<ans<<endl;
}
return 0;
}
B
Codeforces Beta Round #65 (Div. 2), problem: (A) Way Too Long Words题目大意
字符串长度超过10个的,中间部分用中间部分长度代替
题解
对于输入的字符串,进行判断,长度大于10,那么就处理一下,中间长度等于总长度-2 最后将数字转化为字符串 (用stringstream就可以了)
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
string s;
string res;
for(int i=0;i<n;i++){
cin>>s;
res="";
int len=s.length();
if(len>10){
len-=2;
res+=s[0];
stringstream ss;
ss<<len;
string s2;
ss>>s2;
res+=s2;
res+=s[len+1];
cout<<res<<endl;
}
else
cout<<s<<endl;
}
return 0;
}
C
VK Cup 2012 Qualification Round 1, problem: (A) Next Round
题目大意
在一个数组中找到比给定值大的个数 不包括0
题解
水题,一层for循环解决
#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
int a[maxn];
int n,m;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>n>>m){
for(int i=1;i<=n;i++)
cin>>a[i];
int res=0;
for(int i=1;i<=n;i++){
if(a[i]>=a[m]&&a[i])
++res;
}
cout<<res<<endl;
}
return 0;
}
D
Codeforces Beta Round #89 (Div. 2), problem: (A) String Task
题目大意
将所有字母变为小写字母后,然后删除掉相应特殊字符,最后输出时在每个字母前加.
题解
题目意思很容易看懂,但有一个新知识:transform(s.begin(),s.end(),s.begin(),::tolower); 函数是用来将所有字母变为小写字母 把tolower变为toupper就是变成大写字母了
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
transform(s.begin(),s.end(),s.begin(),::tolower);
int n=s.length();
for(int i=0;i<n;i++){
if(s[i]=='a'||s[i]=='o'||s[i]=='y'||s[i]=='e'||s[i]=='u'||s[i]=='i')
continue;
else
cout<<'.'<<s[i];
}
cout<<endl;
return 0;
}
E
Codeforces Beta Round #85 (Div. 2 Only) A. Petya and Strings
题目大意
比较两段字符串,大小写没限制,小于输出-1 等于输出0 大于输出1
题解
正好又用到了上题的函数,由于C++里面字符串可以按照字典序进行排序,然后题目要求大小写没限制,我们可以把它们全部变为小写字母或者大写字母都可以 然后我们直接进行比较就可以得出答案
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin>>s1>>s2;
transform(s1.begin(),s1.end(),s1.begin(),::tolower);
transform(s2.begin(),s2.end(),s2.begin(),::tolower);
if(s1<s2)
cout<<-1<<endl;
else if(s1==s2)
cout<<0<<endl;
else
cout<<1<<endl;
return 0;
}
F
Codeforces Beta Round #77 (Div. 2 Only) A. Football题目大意
给你两支队伍,然后用一段字符串表示队伍的位置,两支队伍分别用0和1来表示 让你判断是否出现连续0或1 达到长度超过7 如果超过了就输出YES 否则输出NO
题解
直接遍历一遍字符串 用两个变量存0和1出现次数 只要一个出现次数超过了7次 直接输出YES 否则输出NO
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
string s;
cin>>s;
int flag=1;
int n=s.length();
int ans0=0,ans1=0;
for(int i=0;i<n;i++){
if(s[i]=='0'){
ans1=0;
ans0++;
}
if(ans0>=7){
flag=0;
break;
}
if(s[i]=='1'){
ans0=0;
ans1++;
}
if(ans1>=7){
flag=0;
break;
}
}
if(!flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
G
Codeforces Beta Round #87 (Div. 1 Only) A. Party题目大意
就是求小组个数,不存在雇佣关系,所需最小的组数其实就是树的最大深度,一棵树有多少层那就必须有多少个小组
题解
可以把他们的关系看成一棵树,去寻找树的最大深度,就可以用DSF来找,直接采用并查集方式找根节点
#include<bits/stdc++.h>
using namespace std;
const int maxn=2000+10;
int p,pre[maxn];
int cnt;
int dfs(int x){
if(x==pre[x])
return x;
else{
cnt++;
return dfs(pre[x]);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=n;i++){
cin>>p;
if(p!=-1)
pre[i]=p;
}
int ans=-1;
for(int i=1;i<=n;i++){
cnt=1;
dfs(i);
ans=max(ans,cnt);
}
cout<<ans<<endl;
return 0;
}
H
Codeforces Round #163 (Div. 2), problem: (A) Stones on the Table
题目大意
求需要几个步骤使得字符串中相邻的字符不相同
题解
水题,遍历一遍即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=100+10;
char s[maxn];
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
int ans=0;
char ch;
for(int i=0;i<n-1;i++){
ch=s[i];
if(s[i+1]==ch){
ch=s[i+1];
++ans;
}
}
cout<<ans<<endl;
return 0;
}
I
题目大意
将字符串第一个字符大写
题解
小写变为大写+32即可
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
if(s[0]>='a'&&s[0]<='z')
s[0]-=32;
cout<<s<<endl;
return 0;
}
J
Codeforces Round #222 (Div. 1), problem: (A) Maze
题目大意
给出一个迷宫,’.’ 表示通路,‘#’ 表示城墙,输入的数据中,‘.’构成的已经联通,要求将k个’.‘转换成’#’,使得剩下的’.'仍然是联通的
题解
深搜,假设共有s个’.‘那么搜索得到的s-k个点必然是联通的,那么只要将剩下的’.‘转换成’#'就行了。
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
const int maxn=500+10;
char mp[maxn][maxn];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
bool vis[maxn][maxn];
bool check(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y]&&mp[x][y]=='.')
return true;
return false;
}
void dfs(int x,int y){
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(check(xx,yy)){
dfs(xx,yy);
}
}
if(s){
s--;
mp[x][y]='X';
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>s;
int px,py;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]=='.'){
px=i,py=j;
}
}
}
dfs(px,py);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<mp[i][j];
}
cout<<endl;
}
return 0;
}
学如逆水行舟,不进则退