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 }
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 }
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 }
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 }