CodeForces Round #585 (Div 2)

score:1336 (-45), pupil
Rank: 3313(又炸了,没啥好说的。。)

B.http://codeforces.com/contest/1215/problem/B

这个题万万没想到是dp,我的天,一开始直接上暴力,没仔细分析时间复杂度,估计是最近网络赛暴力惯了,没缓过神来。。。

分析见代码:

 1 /*
 2     设pos[i]表示以i为结尾的正区间,neg[i]表示以i为结尾的负区间。状态转移很容易了,见代码
 3     这次真的wa到自闭了,后来改了改竟然又tle,真的自闭到家。。。自闭到家。。。。。
 4 */
 5 #include <bits/stdc++.h>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn = 1e6;
 9 ll pos[maxn], neg[maxn];
10
11 int main()
12 {
13     int n; cin >> n;
14     int x;
15     ll maxpos, maxneg;
16
17     maxpos = maxneg = 0;
18     for (int i = 1; i <= n; i++)
19     {
20         scanf("%d", &x);
21         if (x < 0)
22         {
23             pos[i] = neg[i - 1];
24             neg[i] = 1 + pos[i - 1];
25         }
26         else
27         {
28             pos[i] = 1 + pos[i - 1];
29             neg[i] = neg[i - 1];
30         }
31         maxpos += pos[i];
32         maxneg += neg[i];
33     }
34     cout << maxneg << " " << maxpos << endl;
35 }

C.http://codeforces.com/contest/1215/problem/C

这道题也是,贪心想到了(而且很好想),但是情况没处理好,当ab和ba的情况加起来是奇数的时候输出-1,不然一定有解;

当时以为ab和ba都为奇数的时候还需要一个aa或者bb来做媒介,但其实不用,ab可以自己交换,然后再跟ba交换,花费两次。

代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e6;
 4
 5 int vis[maxn];
 6 char a[maxn], b[maxn];
 7
 8 int main()
 9 {
10     int n; cin >> n;
11     int same, ab, ba;
12     vector<int> resa, resb;
13
14     same = ab = ba = 0;
15     scanf("%s%s", a + 1, b + 1);
16     for (int i = 1; i <= n; i++)
17     {
18         vis[i] = a[i] == b[i] ? 1 : a[i] == ‘a‘ ? 2 : 3;
19         if (vis[i] == 1)
20             continue;
21         else if (vis[i] == 2)
22             resa.push_back(i);
23         else resb.push_back(i);
24     }
25     if ((resa.size() + resb.size()) & 1) return cout << -1 << endl, 0;
26     printf("%d\n", resa.size() / 2 + resb.size() / 2 + (resa.size() % 2 ? 2 : 0));
27     for (int i = 1; i < resa.size(); i += 2)
28         printf("%d %d\n", resa[i - 1], resa[i]);
29     for (int i = 1; i < resb.size(); i += 2)
30         printf("%d %d\n", resb[i - 1], resb[i]);
31     if (resa.size() % 2)
32     {
33         printf("%d %d\n", resa[resa.size() - 1], resa[resa.size() - 1]);
34         printf("%d %d\n", resb[resb.size() - 1], resa[resa.size() - 1]);
35     }
36 }

原文地址:https://www.cnblogs.com/liuwenhan/p/11526711.html

时间: 2024-08-30 17:02:54

CodeForces Round #585 (Div 2)的相关文章

Codeforces Round #585 (Div. 2) B. The Number of Products

题目地址:http://codeforces.com/contest/1215/problem/B 题意:给你一个值都不为零的数组,分别找出有多少个连续的子串乘积小于零,大于零. 我的思路:先找出为正数的基础子串x个,即单个正数或两个负数连起来的子串算一个,可算得...算了一直wrong在样例7.还没想出来那错了,就不写了. 别人家的思路:从首开始找负数字串,即有一个负数后,在下一个负数前这里面的都是负数子串.而其他的就为正数子串,正数子串初始化应为1,所以得的正数子串最后应加上1.两个负数作为

Codeforces Round #585 (Div. 2) D. Ticket Game

链接: https://codeforces.com/contest/1215/problem/D 题意: Monocarp and Bicarp live in Berland, where every bus ticket consists of n digits (n is an even number). During the evening walk Monocarp and Bicarp found a ticket where some of the digits have bee

Codeforces Round #585 (Div. 2) CF1215A~C

CF1215A. Yellow Cards简单的模拟,给定了黄票张数,判断最少和最多有多少人被罚下场. #include <bits/stdc++.h> using namespace std; int main() { int a,b,aa,bb,n,nnn; cin>>a>>b>>aa>>bb>>n; nnn=n; int t=(aa-1)*a+(bb-1)*b; int tt=0; if(aa<=bb) { if(n>

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除

Codeforces Round #339 (Div. 2) B. Gena&#39;s Code

B. Gena's Code It's the year 4527 and the tanks game that we all know and love still exists. There also exists Great Gena's code, written in 2016. The problem this code solves is: given the number of tanks that go into the battle from each country, f