🌼坏女孩(抖音热门版) - laziness惰/西洛卡 - 单曲 - 网易云音乐
标签:模拟,暴力,排序,贪心,双指针,几何,字符串
目录
前言
昨晚参加了洛谷入门赛和codeforces的div4,今晚参加acwing周赛
接下来,我会把昨晚cf前5题题解写出来,复盘,以便提高会的题目的熟练程度,同时解决未ac题目的bug
一,codeforces检查
标签:模拟,字符串
#include<iostream>
using namespace std;
bool check(char a)
{
string s = "codeforces";
for(int i = 0; i < 10; ++i) {
if(a == s[i]) return true;
}
return false;
}
int main()
{
string s;
int n;
cin>>n;
for(int i = 0; i < n; ++i) {
cin>>s[i];
if(check(s[i])) cout<<"yes";
else cout<<"no";
if(i != n - 1) cout<<endl;
}
return 0;
}
二,接下来的方向
标签:模拟,几何
#include<iostream>
using namespace std;
int main()
{
int n, m, a, b;
cin>>n;
for(int i = 0; i < n; ++i) {
cin>>m;
string s;
cin>>s;
a = 0, b = 0;
for(int j = 0; j < m; ++j) {
if(s[j] == 'u') a++;//横坐标
else if(s[j] == 'd') a--;
else if(s[j] == 'l') b--;//纵坐标
else if(s[j] == 'r') b++;
if(a == 1 && b == 1) {
cout<<"yes";
break;
}
if(j == m - 1) {
cout<<"no";
break;
}
}
if(i != n - 1) cout<<endl;
}
return 0;
}
三,前置和追加
标签:模拟,双指针
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
while(n) {
int m;
string s;
cin>>m;
cin>>s;
int flag = 1;
while(flag) {
flag = 0;
if(s[0] == '0' && s[m - 1] == '1') {
s = s.substr(1, m - 2);
m -= 2;
flag = 1;
}
if(s[0] == '1' && s[m - 1] == '0') {
s = s.substr(1, m - 2);
m -= 2;
flag = 1;
}
}
cout<<s.size();
if(n != 1) cout<<endl;
n--;
}
return 0;
}
四,明显的分裂
标签:暴力,贪心,字符串
#include<iostream>
#include<set> //set<char>a;
#include<vector> //vector<int>b(m) ;
using namespace std;
int main()
{
int n;
cin>>n;
while(n) {
int m;
cin>>m;
string s;
cin>>s;
set<char>a;
vector<int>b(m); //长度跟字符串一样
for(int i = m - 1; i >= 0; --i) {
a.insert(s[i]); //正序插入
b[i] = a.size(); //尾在前
}
a.clear(); //清空a集合
int ans = 0; //记得初始化
for(int i = 0; i < m - 1; ++i) {
a.insert(s[i]); //头在前
ans = max(int(a.size()) + b[i + 1], ans); //int转化
}
cout<<ans;
if(n != 1) cout<<endl;
n--;
}
return 0;
}
五,负数和正数
标签:贪心,排序
比如
1 -3 4 -16 2 -8 2
1 -3 4 -16 -2 8 2
1 -3 4 16 2 8 2
-1 3 4 16 2 8 2
发现这个规律后,代码就变得很简单了
否则就像我一开始,写了半小时也只过了样例。。。
#include<iostream>
#include<cmath> //abs()
using namespace std;
int main()
{
int t;
cin>>t;
while(t) {
int n;
cin>>n;
long long sum = 0, min = 1e9, flag = 0; //10的9次方
while(n) {
long long a;
cin>>a;
sum += abs(a); //绝对值
if(a < 0) flag++; //统计负数个数
min = min(min, abs(a));
n--;
}
if(flag % 2) sum -= 2 * min; //减去多加的和本身
printf("%lld", sum);
if(t != 1) printf("\n");
t--;
}
return 0;
}
总结
codeforces很多思维题(也就是规律题),有种回到初高中数学的感觉,所以,不应该固步自封,我们要算法,规律两手抓,能找到规律就用规律(多点见识大佬们的代码),找不到就老老实实上并查集,二叉树,dfs,stl等等
真的,不要一整天用自己的思路死磕代码,多点看看codeforces里别人的代码,以后你做题都会快很多,思路广很多
这就是为什么你要在csdn,acwing,洛谷,codeforces四个网站上打比赛的原因,多点看看别人的ac代码,把思维打开
发表评论