Codeforces Round #306 (Div. 2)

玩的有点脱得一场。。

A:hack最多,本来被kack 能写出来的,但是D快写出来了,所以没管,没想到后面居然变为1000pts,做题顺序,和比赛经验缺乏。

当时只想到一遍扫找到先“AB",即s[pos]='A',s[pos+1]='B',然后再【0,pos-1]找”BA";在【pos+2,s.size())(开区间)找"BA";

但是这是不够的,比如"ABAB" 可以hack掉,

所以还有再扫一遍过程一样:找到先“BA",即s[pos]='B',s[pos+1]='A',然后再【0,pos-1]找”AB";在【pos+2,s.size())(开区间)找"AB";

代码乱写,大概就是这个思路:

   

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<math.h>
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<set>
10 #include<map>
11 
12 using namespace std;
13 #define N 1000010
14 #define inf 0x3f3f3f
15 int a[N];
16 string s;
17 int b[N];
18 int main()
19 {
20     cin>>s;
21     int ans=0,ans1=0;
22     int n=s.size();
23     int pos=0;
24     for (int i=0;i<n-1;i++)
25     {
26         if (s[i]=='A'&&s[i+1]=='B')
27         {
28             ans++;
29             pos=i;
30             break;
31         }
32     }
33 
34      for (int i=0;i<pos-1;i++)
35      if (s[i]=='B'&&s[i+1]=='A')
36      {
37             ans1++;
38 
39             break;
40         }
41      for (int i=pos+2;i<n;i++)
42      if (s[i]=='B'&&s[i+1]=='A')
43         {
44             ans1++;
45 
46             break;
47         }
48 
49     if (ans&&ans1) {cout<<"YES";return 0;}
50 
51 
52     ans=ans1=0;
53     pos=0;
54 
55     for (int i=0;i<n-1;i++)
56     {
57         if (s[i]=='B'&&s[i+1]=='A')
58         {
59             ans++;
60             pos=i;
61             break;
62         }
63     }
64 
65      for (int i=0;i<pos-1;i++)
66      if (s[i]=='A'&&s[i+1]=='B')
67         {
68             ans1++;
69             break;
70         }
71 
72      for (int i=pos+2;i<n;i++)
73      if (s[i]=='A'&&s[i+1]=='B')
74     {
75             ans1++;
76             break;
77         }
78 
79     if (ans&&ans1) {cout<<"YES";return 0;
80     }
81 
82 
83     cout<<"NO";
84       return 0;
85 }
View Code

B题:DFS初级题,但是我写了这道题将近40分钟,太弱了

DFS(t,sum,Max,Min):处理到第t位,当前和,Max,Min;

选与不选,之前又看错题,以为求连续(ps 那样更简单)

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<math.h>
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<set>
10 #include<map>
11 
12 using namespace std;
13 #define N 1000010
14 #define inf 0x3f3f3f
15 
16 typedef long long ll;
17 
18 int a[N];
19 int n,l,r,x;
20 
21 
22 int dfs(int t,int sum ,int Max,int Min)
23 {
24 
25     if (t>n&&sum>=l&&sum<=r&&Max-Min>=x) return 1;
26 
27     if (t>n) return 0;
28     int ret=0;
29     ret+=dfs(t+1,sum,Max,Min);
30     Max=max(Max,a[t]);
31     Min=min(Min,a[t]);
32     sum+=a[t];
33     ret+=dfs(t+1,sum,Max,Min);
34     return ret;
35 }
36 
37 int main()
38 {
39 
40       cin>>n>>l>>r>>x;
41       for (int i=1;i<=n;i++)
42       {
43           cin>>a[i];
44       }
45       cout<<dfs(1,0,-1,inf);
46       return 0;
47 }
View Code

C:脑洞大,退了太久了,主要还是自己没一眼看出来;

我们在字符串中找一位是8的倍数,

在两位中找是8的倍数,

在三位中找是8的位数;

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<math.h>
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<set>
10 #include<map>
11 
12 using namespace std;
13 #define N 1000010
14 #define inf 0x3f3f3f
15 
16 typedef long long ll;
17 
18 int a[N];
19 int n,l,r,x;
20 
21 int main()
22 {
23   string s;
24   cin>>s;
25   int len=s.size();
26   for (int i=0;i<len;i++)
27   if ((s[i]-'0')%8==0)
28   {
29       cout<<"YES"<<endl;
30       cout<<s[i];
31       return 0;
32   }
33 
34   for (int i=0;i<len;i++)
35   for (int j=i+1;j<len;j++)
36   {
37       int tmp=(s[i]-'0')*10+s[j]-'0';
38       if (tmp%8==0)
39       {
40           cout<<"YES"<<endl;
41           cout<<tmp;
42           return 0;
43       }
44   }
45    for (int i=0;i<len;i++)
46    for (int j=i+1;j<len;j++)
47    for (int p=j+1;p<len;p++)
48   {
49       int tmp=(s[i]-'0')*100+(s[j]-'0')*10+s[p]-'0';;
50       if (tmp%8==0)
51       {
52           cout<<"YES"<<endl;
53           cout<<tmp;
54           return 0;
55       }
56   }
57 
58   cout<<"NO";
59   return 0;
60 }
View Code

D:构造题,只留下30分钟构造,还剩8分钟写出来,发现看错了题目(日了)没有重边,--!

    首先:证明k=偶数不成立。

    1.因为有桥,所以桥连的两边的度为1

    2.那么将图分为两部分,桥的两点分别在一部分

    3.那么就是一部分图,一个点的度为k-1,其他点度为k,

     4.当k为偶数时,k-1为奇数,那么这部分总的度为奇数,但是一个图的度数和一定是偶数(因为一条边连两个点);

    证毕.

    关于构造:

    这里先只考虑一部分,另一部分是相似的操作;

    先桥的一点1,  1先连k-1个点,那么1的度数满足,

    然后这k-1个点,分别再连k-1个点

  {

   2->k+1,

   3->k+1,

   4->k+1,

  .... 

  k->k+1,

 ....

 2->k+2,

  ....

  类推

}

所以就剩下k-1(即是下标:k+1->2*k-1) 个点的度都差一,

但是k-1是偶数,只要没两个连一下就好了,

另一部分相同,最后是连桥。(1,2*k);

点数是:4*k-2;

代码:

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<math.h>
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<set>
10 #include<map>
11 
12 using namespace std;
13 #define N 1000010
14 #define inf 0x3f3f3f
15 
16 typedef long long ll;
17 int n,m;
18 
19 int a[123456],b[123456];
20 
21 int main()
22 {
23   int k;
24   cin>>k;
25   if (k%2==0)
26   {
27       cout<<"NO";
28       return 0;
29   }
30 
31 
32   for (int i=2;i<=k;i++)
33   a[++m]=1,b[m]=i;
34 
35   for (int i=k+1;i<2*k;i++)
36   for (int j=2;j<=k;j++)
37   a[++m]=j,b[m]=i;
38 
39   for (int i=k+1;i<2*k-1;i+=2)
40   a[++m]=i,b[m]=i+1;
41 
42 
43  // a[++m]=2*k-1;b[m]=k+1;
44 
45   int mm=m;
46 
47   for (int i=1;i<=mm;i++)
48   a[++m]=a[i]+2*k-1,b[m]=b[i]+2*k-1;
49 
50   a[++m]=1;
51   b[m]=2*k;
52 
53   cout<<"YES"<<endl;
54   cout<<4*k-2<<" "<<m<<endl;
55 
56   for (int i=1;i<=m;i++)
57   printf("%d %d\n",a[i],b[i]);
58   return 0;
59 }
View Code

 

posted on 2015-06-05 11:20  forgot93  阅读(189)  评论(0编辑  收藏  举报

导航