Codeforces Round #329(Div2)

CodeForces 593A

题意:n个字符串,选一些字符串,在这些字符串中使得不同字母最多有两个,求满足这个条件可选得的最多字母个数。

思路:用c[i][j]统计文章中只有i,j对应两个字母出现的字符串的长度和。

        c[i][i]表示只有一个字母字符串的累计长度。

        c[i][j]  i!=j时:i>j  i<-->j i与j交换。 

        统计完以后,i,j 0->26.   i==j   ans=max(max,c[i][i])      i!=j     ans=max(max,c[i][j]+c[i][i]+c[j][j])

注意:不能直接暴力,存下每个字符串出现不超过两个不同的字母,再进行两重循环判断,这样比较复杂,并且answer不对。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 int n,c[30][30],len;
 8 char s[1005];
 9 
10 void deal()
11 {
12     len=strlen(s);
13     int f=0,x,y,z;
14     for(int j=0;j<len;j++)
15     {
16         z=s[j]-'a';
17         if(f==0)
18         {
19             x=z;
20             f++;
21         }
22         else if(f==1&&x!=z)
23         {
24             y=z;
25             f++;
26         }
27         else if(f==2&&x!=z&&y!=z)
28         {
29             f++;
30             break;
31         }
32     }
33     if(f==1)
34         c[x][x]+=len;
35     else if(f==2)
36     {
37         if(y<x)
38         {
39             int t=x;x=y;y=t;
40         }
41         c[x][y]+=len;
42     }
43 }
44 
45 int countt()
46 {
47     int maxx=0;
48     for(int i=0;i<26;i++)
49         for(int j=i;j<26;j++)
50         {
51             if(i!=j)
52             maxx=max(maxx,c[i][j]+c[i][i]+c[j][j]);    
53             else
54                 maxx=max(maxx,c[i][j]);
55         }    
56     return maxx;
57 }
58 
59 int main()
60 {
61     while(~scanf("%d",&n))
62     {
63         memset(c,0,sizeof(c));
64         for(int i=0;i<n;i++)
65         {
66             scanf("%s",s);
67             deal();
68         }    
69         printf("%d\n",countt());
70     }
71     return 0;
72 }
View Code

 

CodeForces 593B

题意:在一个坐标中,给定x1,x2.为一个区间范围,给出n条线的Ki,Bi. Yi=Xi*Ki+Bi    x1<Xi<x2.求这些线在x1,x2中间是否有交点。

思路:可以求出每条线与x1,x2的交点,即Y的取值范围。

        例:r1,r2与x1分别交点L1,L2,与x2分别交点R1,R2。两条线相交,必须满足:L1<L2&&R1>R2  ||  L1>L2&&R1<R2

        数据n范围为1e5,直接暴力比较n^2会超时。可利用sort()排序,nlogn. 在排序中对两条线的端点进行判断标记即可

注意:数据范围!!!!

代码:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn=1e5+5;
 7 
 8 int n,x1,x2,flag;
 9 struct node
10 {
11     int l,r;
12 }p[maxn];
13 
14 bool cmp(node a,node b)
15 {
16     if((a.l<b.l&&a.r>b.r)||(a.r<b.r&&a.l>b.l))
17         flag=1;
18     if(a.l==b.l)
19         return a.r<b.r;
20     return a.l<b.l;
21 }
22 
23 int main()
24 {
25     int x,y;
26     while(~scanf("%d",&n))
27     {
28         flag=0;
29         scanf("%d%d",&x1,&x2);
30         for(int i=0;i<n;i++)
31         {
32             scanf("%d%d",&x,&y);
33             p[i].l=x*x1+y;
34             p[i].r=x*x2+y;
35         }
36         sort(p,p+n,cmp);
37         printf("%s\n",flag==1?"YES":"NO");
38     }
39     return 0;
40 }
View Code

 

posted @ 2016-05-26 18:46  初见、  阅读(276)  评论(0编辑  收藏  举报