每日一练
2.15
Problem A Tanya and Postcard
题意:给两个字符串s和t,求相同字母数,再求剩下字母中仅大小写不同数。
简析:分别统计两个串的每个字母个数,再按题意计算。
1 #include<cstdio> 2 #include<string> 3 #include<cstring> 4 using namespace std; 5 const int N=2e5+1; 6 int a,b,n,m,i; 7 char s[N],t[N]; 8 int hs[130],ht[130]; 9 int main(){ 10 scanf("%s %s",s,t); 11 n=strlen(s);m=strlen(t); 12 for(i=0;i<n;++i) hs[s[i]]++; 13 for(i=0;i<m;++i) ht[t[i]]++; 14 for(char ch='A';ch<='Z';++ch){ 15 int t=min(hs[ch],ht[ch])+min(hs[ch+32],ht[ch+32]); 16 a+=t; 17 b+=min(hs[ch]+hs[ch+32],ht[ch]+ht[ch+32])-t; 18 } 19 printf("%d %d ",a,b); 20 return 0; 21 }
Problem B Anya and Smartphone
题意:n个应用,每屏最多k个,应用被运行会前移,要运行m个应用,求最少滑屏和启动次数。
简析:直接模拟即可。
1 #include<cstdio> 2 #define N 100001 3 int n,m,k,b,i,s; 4 int a[N],g[N]; 5 long long ans; 6 int main(){ 7 scanf("%d%d%d",&n,&m,&k); 8 for(i=0;i<n;i++){ 9 scanf("%d",&a[i]); 10 g[a[i]]=i; 11 } 12 while(m--){ 13 scanf("%d",&b); 14 s=g[b]; 15 ans+=(s/k+1); 16 if(s){ 17 int t=a[s];a[s]=a[s-1];a[s-1]=t; 18 g[a[s]]=s;g[a[s-1]]=s-1; 19 } 20 } 21 printf("%lld ",ans); 22 return 0; 23 }
2.16
Problem A Drazil and His Happy Friends
题意:有n个男孩,m个女孩,有些人不开心,有些人开心,在第i天,第i%n 的男孩和 第i%m的女孩一起吃饭,开心的人可以把不开心的人变得开心
求能否使得所有的男孩女孩都开心
简析:暴力模拟
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <climits> 5 #include <cstdlib> 6 #include <cstring> 7 using namespace std; 8 9 int main() 10 { 11 int n, m, b, g, x[101], y[101], temp; 12 while(scanf("%d%d", &n, &m) != EOF) { 13 memset(x, 0, sizeof(x)); 14 memset(y, 0, sizeof(y)); 15 scanf("%d", &b); 16 for(int i = 0; i < b; ++i) { 17 scanf("%d", &temp); 18 x[temp] = 1; 19 } 20 scanf("%d", &g); 21 for(int i = 0; i < g; ++i) { 22 scanf("%d", &temp); 23 y[temp] = 1; 24 } 25 for(int i = 0; i <= 10000; ++i) { 26 if(y[i % m] == 1 || x[i % n] == 1) { 27 y[i % m] = x[i % n] = 1; 28 } 29 } 30 bool flag = false; 31 for(int i = 0; i < m; ++i) { 32 if(y[i] == 0) { 33 flag = true; 34 break; 35 } 36 } 37 for(int i = 0; i < n; ++i) { 38 if(x[i] == 0) { 39 flag = true; 40 break; 41 } 42 } 43 if(!flag) { 44 printf("Yes "); 45 } else { 46 printf("No "); 47 } 48 } 49 return 0; 50 }
还可以扫一遍在[0,gcd(n,m)] 的区间的人是否都为开心的,因为如果编号为 i 的人开心,那么 满足 x%g = i%g 的x 都将在某一天变得开心
1 #include<iostream> 2 using namespace std; 3 int gcd(int a,int b){ 4 return b == 0?a:gcd(b,a%b); 5 } 6 int temp[105]; 7 int main(){ 8 int n,m,t,b,g,x,y; 9 cin>>n>>m; 10 t = gcd(n,m); 11 cin>>b; 12 for(int i = 0; i<b; i++){ 13 cin>>x; 14 temp[x%t] = 1; 15 } 16 cin>>g; 17 for(int i = 0; i<g; i++){ 18 cin>>y; 19 temp[y%t] = 1; 20 } 21 int ans = 0; 22 for(int i = 0; i<t; i++){ 23 if(temp[i]) ans++; 24 } 25 if(ans == t) printf("Yes "); 26 else printf("No "); 27 return 0; 28 }
Problem B Drazil and Factorial
题意:定义 F(xyz) = x! * y! * z!,找到最大的uvw 使得 F(uvw) = F(xyz)
简析:1 != 1!
2! = 2!
3! = 3!
4! = 2! * 2!
5! = 5!
6! = 5! * 3!
7 !=7!
8! =7! * 2! * 2!* 2!
9!=7!*3!*3!*2!
把每一位分解,然后再排下序
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int ss[100005]; 7 char str[20]; 8 int s[10][5]={{0},{0},{2},{3},{3,2,2},{5},{5,3},{7},{7,2,2,2},{7,3,3,2}}; 9 int cmp(int a,int b) 10 { 11 return a>b; 12 } 13 int main() 14 { 15 int n,i,j,k=0; 16 scanf("%d",&n); 17 scanf("%s",&str); 18 for(i=0;i<n;i++) 19 { 20 int a=str[i]-'0'; 21 for(j=0;s[a][j]!=0;j++) 22 { 23 ss[k]=s[a][j]; 24 k++; 25 } 26 } 27 sort(ss,ss+k,cmp); 28 for(i=0;i<k;i++) 29 printf("%d",ss[i]); 30 printf(" "); 31 }
2.17
Problem A Han Solo and Lazer Gun
题意:给一个原点和n个其他点,求过原点的最少直线数使得n个点都在直线上。
简析:由于n很小,可以n2判断每两点是否能共线。
当然考虑到原点已定,直线仅由斜率确定,也可以扫一遍所有点,记录斜率判重。
1 #include<cstdio> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 6 int main() 7 { 8 set<double> s; 9 int n,x0,y0,x,y,p=0; 10 scanf("%d%d%d",&n,&x0,&y0); 11 for(int i=1;i<=n;i++){ 12 scanf("%d%d",&x,&y); 13 if(y0!=y){ 14 double t=1.000000*(x0-x)/(y0-y); 15 s.insert(t); 16 } 17 else p=1; 18 } 19 printf("%d ",s.size()+p); 20 21 return 0; 22 }
Problem B Watto and Mechanism
题意:给一个n个字符串的集合,询问m个字符串,问在集合中是否存在与询问串仅有一个字符不同的等长串。
简析:这题的做法涉及一些大家没有学习过的姿势,可以先做一个了解。
做法一:字符串哈希,一份介绍PPT戳这里。
但是我们知道CF是有hack的,如果你的哈希没有冲突处理,场上都可以hack,
只不过现在赛后数据固定下来了,一些没有处理冲突的也可以过。
做法二:Trie字典树+dfs,可以找一些相关资料学习一下然后抄一份板。
有哪里不会可以去问高翔!
1 #include<cstdio> 2 #include<cstring> 3 int n,m; 4 char s[1000010]; 5 struct Trie 6 { 7 int index; 8 Trie *next[3]; 9 Trie() 10 { 11 index=-1; 12 memset(next,0,sizeof(next)); 13 } 14 }; 15 Trie *root=new Trie; 16 void Trie_Insert(Trie *tr,int len) 17 { 18 if(s[len]!='