标签:
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])
代码:
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 }
标签:
原文地址:http://www.cnblogs.com/By-ruoyu/p/5532600.html