A. Bark to Unlock
题目链接:http://codeforces.com/contest/868/problem/A
题目意思:密码是两个字符组成的,现在你有n个由两个字符组成的字符串,现在问是否可以用你手上的这些字符串通过拼接其中两个的基础上使得密码是这个拼接而成的字符串的子串,一个字符串可以使用多次,这意味这自己拼接自己也是可以的。
题目思路:暴力枚举这个过程,因为总共就n最大也就100
代码:
1 /* *********************************************** 2 Author :xiaowuga 3 Created Time :2017年10月05日 星期四 15时07分23秒 4 File Name :A.cpp 5 ************************************************ */ 6 #include <bits/stdc++.h> 7 typedef long long LL; 8 #define endl " " 9 #define inf 0x3f3f3f3f 10 const long long N=1000000; 11 const long long mod=1e9+7; 12 using namespace std; 13 int main(){ 14 ios::sync_with_stdio(false);cin.tie(0); 15 string q; 16 cin>>q; 17 int n; 18 cin>>n; 19 string a[101]; 20 for(int i=0;i<n;i++) cin>>a[i]; 21 for(int i=0;i<n;i++){ 22 for(int j=i;j<n;j++){ 23 string s=a[i]+a[j]; 24 if(s.find(q)!=string::npos){ 25 cout<<"YES"<<endl; 26 return 0; 27 } 28 string ss=a[j]+a[i]; 29 if(ss.find(q)!=string::npos){ 30 cout<<"YES"<<endl; 31 return 0; 32 } 33 } 34 } 35 cout<<"NO"<<endl; 36 return 0; 37 }
B. Race Against Time
题目链接:http://codeforces.com/contest/868/problem/B
题目意思:现在时间停止了。给你一个时间,表示现在指针在钟面上的分布情况,问点a是否可以到达点b(如果点a无法到达b说明,不管a顺时针走还是逆时针走都是碰到指针,以至于无法到达B)。
题目思路:这个题目有一个坑点导致wa了很多人,就是比如十点四十五分三十秒,我们发现时针和秒针都不是在刚好整格的地方,这就说明这个题需要一个精度问题。所以我们把分针和秒针的贡献都算在时针上,秒针对分针的贡献算在分针上,然后看一下,如果是三个指针都在ab点之间就说明可以到达,否则不行。
代码:
1 /* *********************************************** 2 Author :xiaowuga 3 Created Time :2017年10月05日 星期四 15时37分27秒 4 File Name :B.cpp 5 ************************************************ */ 6 #include <bits/stdc++.h> 7 typedef long long LL; 8 #define endl " " 9 #define inf 0x3f3f3f3f 10 const long long N=1000000; 11 const long long mod=1e9+7; 12 using namespace std; 13 double a[20]={0,5,10,15,20,25,30,35,40,45,50,55,0}; 14 int main(){ 15 ios::sync_with_stdio(false);cin.tie(0); 16 int hh,tt1,tt2; 17 double m,s; 18 cin>>hh>>m>>s>>tt1>>tt2; 19 double h=a[hh]+1.0*5*m/60+1.0*5*s/3600; 20 m=m+1.0*s/60; 21 int t1=a[tt1]; 22 int t2=a[tt2]; 23 int c1=0,c2=0; 24 if(t1>t2) swap(t1,t2); 25 if(h>t1&&h<t2) c1++; 26 else c2++; 27 if(m>t1&&m<t2) c1++; 28 else c2++; 29 if(s>t1&&s<t2) c1++; 30 else c2++; 31 if(c1==3||c2==3) cout<<"YES"<<endl; 32 else cout<<"NO"<<endl; 33 return 0; 34 }
C. Qualification Rounds
题目链接:http://codeforces.com/contest/868/problem/C
题目意思:有k个队伍n个题目,现在要从n个问题中找到一个子集,使得k个队伍中没有一个队伍会做这个子集中超过一半题目。
题目思路:只要出两个题目就可以了,把每道题的掌握情况压成一个十进制数,然后暴力枚举所有的数,看一下是否有两个数&在一起为0。保证会做其中一道题的一定不会做另一到题。
代码:
1 /* *********************************************** 2 Author :xiaowuga 3 Created Time :2017年10月05日 星期四 18时02分29秒 4 File Name :C.cpp 5 ************************************************ */ 6 #include <bits/stdc++.h> 7 typedef long long LL; 8 #define endl " " 9 #define inf 0x3f3f3f3f 10 const long long N=1000000; 11 const long long mod=1e9+7; 12 using namespace std; 13 int a[20]; 14 vector<int>b; 15 int main(){ 16 ios::sync_with_stdio(false);cin.tie(0); 17 int n,k; 18 cin>>n>>k; 19 for(int i=0;i<n;i++){ 20 int sum=0; 21 for(int j=0;j<k;j++){ 22 sum*=2; 23 int t; 24 cin>>t; 25 sum+=t; 26 } 27 a[sum]++; 28 } 29 for(int i=0;i<=(1<<k);i++) if(a[i]) b.push_back(i); 30 if(b[0]==0){cout<<"YES"<<endl;return 0;} 31 for(int i=0;i<b.size()-1;i++){ 32 for(int j=i+1;j<b.size();j++){ 33 int t=b[i]&b[j]; 34 if(!t){ cout<<"YES"<<endl;return 0;} 35 } 36 } 37 cout<<"NO"<<endl; 38 return 0; 39 }