Educational Codeforces Round 165 (Rated for Div. 2)
教育场,最近也是蓝桥杯打完了,第一次打,又菜又爱玩,很多题型都没见过,像学新东西一样,还有就是最后一题连线性筛也忘记了,不过本省比较友好(广西),以为预定省4了,没想到最后还是挤进了省2,继续努力吧,回到正题,蓝桥之后打的第一场,div2(连div3都打不过的小辣鸡来挑战一下div2)没想到最后还能写出两题,不过花了好长时间啊,一个半小时写两题,看来还得多练
所以这里就来记录一下写出来的两题(看过题数也是前两题正常QAQ,后面断崖式)
A题



一开始看到排列又看到某个位置的值和另一个位置有关 就想到蓝桥杯传送阵那题,图论我还没入门QAQ
耐心读了一下题目,要求是至少有2个朋友来, 分析得到,要让a去那么就要邀请a和a的朋友,这时候a就一定会去(b去不去随意)
那么最理想的情况就是 a和b互为好朋友 邀请a和b一起去,这样a因为b被邀请了a一定去,
b因为a被邀请了一定去这样就一定有2个人去
另一种操作少的情况是 邀请a去 然后邀请a的好朋友b去 (b的好朋友不是a是c) 再邀请c去这样就会有有2个人会去
第一题AC代码:
#include <iostream>
using namespace std;
const int N=100;
int a[N];
int main(void)
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int i=1;
for(;i<=n;i++)
if(a[a[i]]==i)//a[i]为i的好朋友 a[a[i]]为a[i]的好朋友 如果a[i]的好朋友是i 那么拉他们俩就可以了 否则3个就可以了
{
puts("2");
break;
}
if(i>n)puts("3");
}
return 0;
}
B题





这题的操作对于我来说非常眼熟,因为在yxc的语法基础课字符串那一章的题目还有印象,一开始我一为是暴力模拟,但是还没看出思路,然后我就模拟样例,经过慢悠悠的尝试以后,发现了一种做法,就是遇到逆序的0 即1后面的0就把0放到最前面的1的位置
(比如110) 直接变成011 代价是3 如果是 110->101->011的话 代价是4 所以直接放是最小的
逆序0也是遇到的第一个就往前放,(01100)如果最后一个0前面出了2个1还有一个0 这样代价会较大,而先放倒数第二个0以后代价最后一个0前面就是两个1
所以这题是需要把逆序零前面有多少个1处理出来就好了 代价就是加上它本身的1的长度
#include <iostream>
typedef long long LL;
using namespace std;
int main(void) {
int T;
cin >> T;
while (T--) {
string s;
cin >> s;
int sum = 0; //记录前面1的个数
LL res = 0;
for (auto c : s) {
if (c == '1')
sum++;
if (sum && c == '0')//逆序0
res += 1 + sum;
}
cout << res << endl;
}
return 0;
}
其实这不是我最开始的做法 我一开始想的真的很复杂 还以为是逆序对,卡特兰数…(数论忘光了…)
不过我最后的大方向也对了,我的想法就比较朴素,
我的想法就是 找逆序0 然后维护第一个1的位置
然后用了双指针
细节看代码:
#include <iostream>
using namespace std;
typedef long long LL;
int main(void) {
int T;
cin >> T;
while (T--) {
string s;
cin >> s;
if (s.find('1') == -1 || s.find('0') == -1) {
puts("0");
continue;
}
int idx = s.find('1');
LL res = 0;
for (int i = idx; i < s.size(); i++)//这里直接从第一个1往后找 1前面的0就不用考虑了
{
int j = i;
while (j < s.size() && s[j] != '0')
j++;//找逆序0的位置(最近的,前面一个是1)
if (s[j] == '0') {
res += j - idx + 1;
idx++;//模拟 第一个1会往后移动1格
i = j;//让i直接去到逆序0的下一个位置
}
}
cout << res << endl;
//找逆序0按顺序移动
}
return 0;
}
作者分享了参加EducationalCodeforcesRound165中的两道Div.2题目解题经历,涉及图论中朋友邀请问题和字符串逆序0优化算法,通过实例展示了C++代码实现。

1088

被折叠的 条评论
为什么被折叠?



