前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforces Round #329 div2

Codeforces Round #329 div2

作者头像
熙世
发布2019-07-14 13:47:28
3050
发布2019-07-14 13:47:28
举报
文章被收录于专栏:Code思维奇妙屋

Problem_A(593A):

题意:

  给n个单词, 每个单词由小写字母组成, 且长度<=1000.

  组成一篇文章的要求是:

    所有单词所用字母 <= 2

    即最多只能有两个不同的字母。

  求一篇文章的最长长度。

思路:

  首先注意到单词都是由小写字母组成,小写字母只有26个, 所以可以转换一下:

    如果一个单词所用字母超过2个, 那么我们舍弃它。因为它怎么都不可能会是一篇文章的组成部分。

    如果没有超过两个, 那么找出这两个单词, 记录它的长度即可。

  设f[i][j] = 只有字母为i + 'a' 和 j + 'a'的单词的长度,如果i == j则只有一个字母。

  答案则为 max(f[i][j] + f[i][i] + f[j][j] (f[i][j] > 0), f[i][i] + f[j][j])

代码:

代码语言:javascript
复制
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <stack>
10 #include <queue>
11 #include <string>
12 #include <vector>
13 #include <fstream>
14 #include <iterator>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std;
18 #define LL long long
19 #define INF 0x3f3f3f3f
20 #define MOD 1000000007
21 #define eps 1e-6
22 #define MAXN 100010
23 #define MAXM 100
24 #define dd {cout<<"debug"<<endl;}
25 #define pa {system("pause");}
26 #define p(x) {printf("%d\n", x);}
27 #define pd(x) {printf("%.7lf\n", x);}
28 #define k(x) {printf("Case %d: ", ++x);}
29 #define s(x) {scanf("%d", &x);}
30 #define sd(x) {scanf("%lf", &x);}
31 #define mes(x, d) {memset(x, d, sizeof(x));}
32 #define do(i, x) for(i = 0; i < x; i ++)
33 #define dod(i, x, l) for(i = x; i >= l; i --)
34 #define doe(i, x) for(i = 1; i <= x; i ++)
35 struct node
36 {
37     LL l;
38     LL r;
39 };
40 int n;
41 LL x[2];
42 bool flag;
43 struct node f[MAXN];
44 bool cmp(struct node x, struct node y)
45 {
46     if(((x.l - y.l < 0) && (x.r - y.r > 0)) || ((x.l - y.l > 0) && (x.r - y.r < 0)))
47         flag = true;
48     if(x.l == y.l) return x.r < y.r;
49     return x.l < y.l;
50 }
51 
52 int main()
53 {
54     flag = false;
55     scanf("%d", &n);
56     scanf("%I64d %I64d", &x[0], &x[1]);
57     LL k, b;
58     for(int i = 0; i < n; i ++)
59     {
60         scanf("%I64d %I64d", &k, &b);
61         f[i].l = x[0] * k + b;
62         f[i].r = x[1] * k + b;
63     }
64     sort(f, f + n, cmp);
65     printf("%s\n", flag? "YES" : "NO");
66     return 0;
67 }

Problem_B(593B):

题意:

  给n条直线, 然后一个区间[x1, x2].

  问, 这n条直线之中, 是否会有直线在[x1, x2]这个区间上有交点。

思路:

  嗯....利用了奇淫技巧。

  正常的思路是这样的:

    先把每条直线在这个区间的值域[y1, y2]求出来。

    然后会发现, 如果两条直线在这里有交点的话, 必然是对应两端点之差的符号相反。

    即[y1, y2] [y3, y4]:

      y1 - y3 < 0 && y2 - y4 > 0 或者

      y1 - y3 > 0 && y2 - y4 < 0

  贪心即可, 然而个人比较懒, 利用sort偷了个懒。

代码:

代码语言:javascript
复制
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <stack>
10 #include <queue>
11 #include <string>
12 #include <vector>
13 #include <fstream>
14 #include <iterator>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std;
18 #define LL long long
19 #define INF 0x3f3f3f3f
20 #define MOD 1000000007
21 #define eps 1e-6
22 #define MAXN 100010
23 #define MAXM 100
24 #define dd {cout<<"debug"<<endl;}
25 #define pa {system("pause");}
26 #define p(x) {printf("%d\n", x);}
27 #define pd(x) {printf("%.7lf\n", x);}
28 #define k(x) {printf("Case %d: ", ++x);}
29 #define s(x) {scanf("%d", &x);}
30 #define sd(x) {scanf("%lf", &x);}
31 #define mes(x, d) {memset(x, d, sizeof(x));}
32 #define do(i, x) for(i = 0; i < x; i ++)
33 #define dod(i, x, l) for(i = x; i >= l; i --)
34 #define doe(i, x) for(i = 1; i <= x; i ++)
35 struct node
36 {
37     LL l;
38     LL r;
39 };
40 int n;
41 LL x[2];
42 bool flag;
43 struct node f[MAXN];
44 bool cmp(struct node x, struct node y)
45 {
46     if(((x.l - y.l < 0) && (x.r - y.r > 0)) || ((x.l - y.l > 0) && (x.r - y.r < 0)))
47         flag = true;
48     if(x.l == y.l) return x.r < y.r;
49     return x.l < y.l;
50 }
51 
52 int main()
53 {
54     flag = false;
55     scanf("%d", &n);
56     scanf("%I64d %I64d", &x[0], &x[1]);
57     LL k, b;
58     for(int i = 0; i < n; i ++)
59     {
60         scanf("%I64d %I64d", &k, &b);
61         f[i].l = x[0] * k + b;
62         f[i].r = x[1] * k + b;
63     }
64     sort(f, f + n, cmp);
65     printf("%s\n", flag? "YES" : "NO");
66     return 0;
67 }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档