Codeforces Round #407 (Div. 2)(争取明天24点前补掉)

A - Anastasia and pebbles(水题)

题意:

  一个人有俩口袋,每个口袋最多装k个,然后每天每个口袋里的石头颜色必须都相同,问你最少用几天能装完。

思路:

  水题。。一不小心写瓷了,以为A题大水题,瞎写也不会T,没仔细想。。写了一个T的代码。

 1 #include  <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n, k;
 6     cin >> n >> k;
 7     vector<int>vec;
 8     for(int i = 1; i <= n; i++)
 9     {
10         int x;
11         scanf("%d", &x);
12         vec.push_back(x);
13     }
14     int ans = 0;
15     for(auto o : vec)
16     {
17         ans += (o + k - 1) / k;
18     }
19     cout << (ans + 1) / 2 <<endl;
20     return 0;
21 }

B - Masha and geometric depression(模拟)

题意:

  给你一个等差数列的首项b1和公比q,还有一个上界l,但是b1和q都可以为0。又给出一个序列a,然后挨个计算出这个等差数列bi,如果bi出现在序列a中,那么就不写出来,最后问你写出来的数有几个。前提是所有的bi的绝对值都必须不超过上界l。

思路:

  一开始写了一个分类讨论的,比较麻烦。。容易写wa。

 1 #include  <bits/stdc++.h>
 2 using namespace std;
 3 typedef long  long LL;
 4 int main()
 5 {
 6     int b1, q, l, m;
 7     cin >> b1 >>q >> l >> m;
 8
 9     set<LL>s;
10     for(int i = 0; i < m; i++)
11     {
12         LL x;
13         cin >> x;
14         s.insert(x);
15     }
16
17     if(abs(b1) > l)
18     {
19         puts("0");
20         return 0;
21     }
22
23     if(b1 == 0)
24     {
25         int haveb1 = (s.find(b1) == s.end());
26         if(haveb1)  puts("inf");
27         else puts("0");
28     }
29     else if(q == 0)
30     {
31         LL haveb1 = (s.find(b1) == s.end());
32         LL have0 = (s.find(0) == s.end());
33         if(have0) puts("inf");
34         else if(haveb1) puts("1");
35         else puts("0");
36
37     }
38     else if(q == 1)
39     {
40         int haveb1 = (s.find(b1) == s.end());
41
42         if(haveb1)puts("inf");
43         else printf("0\n");
44     }
45     else if(q == -1)
46     {
47         int haveb1 = (s.find(b1) == s.end());
48         int havefub1 = (s.find(-b1) == s.end());
49         if(haveb1 || havefub1)  puts("inf");
50         else printf("0\n");
51
52     }
53     else
54     {
55         LL ans = 0;
56         for(LL i = b1; abs(i) <= l; i *= q)
57         {
58             if(s.find(i) == s.end()) ans++;
59         }
60         cout << ans << endl;
61     }
62     return 0;
63 }

C - Functions again(最大字段和)

题意:

  给你这么一个公式, ,输出f的最大值。

数据:

   (2?≤?n?≤?105)(-109?≤?ai?≤?109)

思路:

  拿一两个样例比划一下,就能明白,其实就是最大字段和,扫两边,翻转一下正负号就好了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long  long LL;
 4
 5 LL a[100000 + 5];
 6 LL d[100000 + 5];
 7 int n;
 8 LL solve()
 9 {
10     LL maxx = -(1LL << 60);
11     LL temp = 0;
12     for(int i =0; i < n - 1; i++)
13     {
14         if(temp < 0)    temp = d[i];
15         else temp += d[i];
16         maxx = max(maxx, temp);
17     }
18     return maxx ;
19 }
20 int main()
21 {
22     cin >> n;
23     for(int i = 0; i < n; i++)
24     {
25         cin >> a[i];
26     }
27     for(int i = 0; i < n; i++)
28     {
29         d[i] = abs(a[i + 1] - a[i]);
30         if(i % 2 == 0)  d[i] *= -1;
31     }
32
33     LL maxx1 = solve();
34
35     for(int i = 0; i < n; i++)
36     {
37         d[i] *= -1;
38     }
39
40     LL maxx2 = solve();
41
42
43     cout << max(maxx1, maxx2) << endl;
44     return 0;
45 }

D - Weird journey

E - The Great Mixing

题意:

  给你一个数n,一个数k,再给k个数字,每个数字可以选择任意个数,最后问你最少使用“几个次”数字使得平均数为n。

数据:

   (0?≤?n?≤?1000, 1?≤?k?≤?106) ,(0?≤?ai?≤?1000)

思路:

  先统一一下度量,这k个数字ai,对最后结果的贡献应该是ai-n吧,所以先这么处理一下。然后bfs就行了。因为最多只有-1000到1000的范围,而k个数字实际上,只有最多有1000种。所以大概是1k*2k的样子。所以bfs没啥问题。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int>pii;
 4
 5 int n, k;
 6 int step[2005];
 7 queue<int>que;
 8 set<int>vec;
 9
10 int solve()
11 {
12     while(que.size())
13     {
14         int val = que.front();que.pop();
15         if(val == 0)    return step[val + 1000];
16         for(auto o : vec)
17         {
18             int fval = val + o;
19             if(fval >= -1000 && fval <= 1000 && step[fval + 1000] == 0)
20             {
21                 que.push(fval);
22                 step[fval + 1000] = step[val + 1000] + 1;
23             }
24         }
25     }
26     return -1;
27 }
28
29 int main()
30 {
31
32     scanf("%d%d", &n, &k);
33     for(int i = 0; i < k; i ++)
34     {
35         int x;
36         scanf("%d", &x);
37         x -= n;
38         vec.insert(x);
39         que.push(x);
40         step[x + 1000] = 1;
41     }
42     printf("%d\n", solve());
43
44     return 0;
45 }
时间: 2024-10-14 04:26:21

Codeforces Round #407 (Div. 2)(争取明天24点前补掉)的相关文章

Codeforces Round #407 (Div. 2) C Functions again(最大子序列和)

Something happened in Uzhlyandia again... There are riots on the streets... Famous Uzhlyandian superheroes Shean the Sheep and Stas the Giraffe were called in order to save the situation. Upon the arriving, they found that citizens are worried about

Codeforces Round #407 (Div. 2)解题报告

好遗憾没参加这场比赛--vp取得了目前最高的名次orz A. Anastasia and pebbles 向上取整处理即可. 1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 typedef long long ll; 8 typed

Codeforces Round #407 (Div. 2)

A 模拟 B 大力分类讨论 |b1|?>?l - answer is 0. b1?=?0 - if 0 is present in array a than answer is 0, else inf. q?=?1 - if b1 is present in array a than answer is 0, else inf. q?=??-?1 - if both b1 and ?-?b1 are present in array a than answer is 0, otherwise i

Codeforces Round #590 (Div. 3)(e、f待补

https://codeforces.com/contest/1234/problem/A A. Equalize Prices Again 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int main(){ 5 int n,a; 6 int t; 7 cin>>t; 8 ll sum = 0,ans; 9 while(t--){ 10 cin>>n;sum = 0

Codeforces Round #469 (Div. 2)

Codeforces Round #469 (Div. 2) 难得的下午场,又掉分了.... Problem A: 怎么暴力怎么写. 1 #include<bits/stdc++.h> 2 #define fi first 3 #define se second 4 #define mk make_pair 5 #define pii pair<int,int> 6 #define read(x) scanf("%d",&x) 7 #define sre

# Codeforces Round #529(Div.3)个人题解

Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Repeating Cipher 传送门 题意:第一个字母写一次,第二个字母写两次,依次递推,求原字符串是什么 题解:1.2.3.4,非常明显的d=1的等差数列,所以预处理一个等差数列直接取等差数列的每一项即可 代码: #include<bits/stdc++.h> using namespace s

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

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序列,如果我