Educational Codeforces Round 102 (Rated for Div. 2)
A. Replacing Elements
题意:就是有一组数,然后数组中的数可以这样变换:Ai+Aj=Ak,通过这样的变换可以让数组中的数字变化,然后题目中给定d,问通过数组中这样的变换是不是可以全部元素小于等于d
思路:满足条件的有两种情况:1)最小的两个数加和小于等于d;2)全部元素相等,都等于d,这样的话,进行标记,看看是满足哪个条件,满足的话输出YES,不满足的话输出NO
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int main(){ 8 int t; 9 scanf("%d",&t); 10 while(t--){ 11 int n,m; 12 scanf("%d %d",&n,&m); 13 int a[3000]={0}; 14 int flag=0; 15 for(int i=0;i<n;i++){ 16 scanf("%d",&a[i]); 17 if(a[i]<=m){ 18 flag++; 19 } 20 } 21 sort(a,a+n); 22 if(flag==n){ 23 printf("YES\n"); 24 }else if(a[0]+a[1]<=m){ 25 printf("YES\n"); 26 }else{ 27 printf("NO\n"); 28 } 29 } 30 }
B.String LCM
题目:题目中给定两个字符串,由这两个字符串循环构成的最小公共字符串是什么,所谓构成就是'ababab'可以由‘ab'构成,不能由’aa'构成,如果没有最小的公共字符串,那么输出-1
思路:先根据长度找到这个最小的公共字符串可能是什么,主要是满足两个条件,一个是找到的这个最小单位,既能组成所给的字符串,也能组成最小的公共字符串,那么就应用到长度的最小公倍数m去找,如果第一个字符串循环构成长度为m的字符串是不是和第二个字符串构成的相同
当时忽略掉的点:1)当时只想是不是和二进制数有关系,发现这种包含只是形式上的包含,表面上看着有就是有,没有就是没有;2)又想这个怎么找到构成两个字符串的最小字符串,想着比较他们是不是一样;3)应该考虑到固定长度内变化的,可以先让他们变化出来可能更简单,然后再进行比较
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int main(){ 8 int t; 9 scanf("%d",&t); 10 while(t--){ 11 char s1[50],s2[60]; 12 cin>>s1; 13 cin>>s2; 14 int len1=strlen(s1); 15 int len2=strlen(s2); 16 int mid=len1*len2/(__gcd(len1,len2)); 17 string s=""; 18 for(int i=0;i<mid/len1;i++){ 19 s+=s1; 20 } 21 string ss=""; 22 for(int i=0;i<mid/len2;i++){ 23 ss+=s2; 24 } 25 26 if(s==ss){ 27 cout<<s<<endl; 28 29 }else{ 30 printf("-1\n"); 31 } 32 33 } 34 }
感想:进了复习周就没有好好的整过cf的题,更没有好好的敲打代码,现在重新收拾起来觉得真的有点力不从心,看第一题的题目理解都要半天,看来现在必须得每天刷题才能重新回到之前的状态,才能更好的学习一些算法知识

浙公网安备 33010602011771号