Codeforces1278 (Edu Div2)
------------------------------------------------------------
整体比赛总结:
做出了A,B,C 感觉D如果时间够的话应该也能出
A题: 9min出 1A 傻逼题 (不表)
B题: 64min出 3A (做了55min,不愧是我!!!!!!)
C题: 112min出 1A (做了48min,不愧是我!!!!!!)
------------------------------------------------------------
感觉想清楚B也不是很难,感觉仔细想想就一下子的事情啊,为什么比赛的时候
就很难做到沉下心去考虑这个问题呢??????????
B题没有冷静思考,也就是没有仔细想好所有的情况
C题的话算法还是很容易想的,感觉我的问题卡在了一个问题上面,感觉写代码的时候
还是没有专注,一下子就漏掉走了,根本就没跟着思考🤔
------------------------------------------------------------
下面是题解:
A题:t 100,n,m都是100.直接暴力就可
下面是代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 typedef long long ll; 7 using namespace std; 8 const int maxn=110; 9 int t; 10 char s1[maxn],s2[maxn]; 11 int c1[28],c2[28],c3[28]; 12 int n,m; 13 int main(){ 14 scanf("%d",&t); 15 while(t--){ 16 scanf("%s",s1+1); 17 scanf("%s",s2+1); 18 n=(int)(strlen(s1+1)); 19 m=(int)(strlen(s2+1)); 20 memset(c1,0,sizeof(c1)); 21 memset(c2,0,sizeof(c2)); 22 memset(c3,0,sizeof(c3)); 23 if(m<n){printf("NO\n");continue;} 24 for(int i=1;i<=n;i++) c1[s1[i]-'a'+1]++; 25 for(int i=1;i<=m;i++) c2[s2[i]-'a'+1]++; 26 // 3 5 27 int ss=0; 28 for(int i=1;i<=m-n+1;i++){ 29 int flag=1; 30 for(int j=1;j<=26;j++) c3[j]=c1[j]; 31 for(int j=i;j<=i+n-1;j++){ 32 c3[s2[j]-'a'+1]--; 33 } 34 for(int j=1;j<=26;j++) if(c3[j]!=0) flag=0; 35 if(flag){printf("YES\n");ss=1;break;} 36 } 37 if(ss==1) continue; 38 printf("NO\n"); 39 } 40 return 0; 41 }
B题:这个题我卡了将近一个小时,我也是醉了
首先弄出他们的差,a=abs(a-b) ,把这个差弄出来以后, 显然的一个想法我先把前面的先分配给第一个小点,这样一直加下去,直到i*(i+1)/2>a
这样的话我们再考虑后面的怎么做,先算a减去i*(i-1)/2弄掉,看a等于不等于0,如果等于就直接输出i-1可以了
否则的话我们接下来继续来做这道题,i肯定是要给小的,然后从小的里面找出一个b来 如果(i-a)%2==0 ,那么说明就一次能弄好这个序列 ,直接输出i即可
否则的话我们肯定接下下分成了两堆, 1,2,......i是给小的那个数的,(i-a)/2是给大的那个数的。 这个时候小的那个数大1?
如果刚好大一的话肯定是能在两步之内分完的,我们只要把i+1给小的, i+2给大的即可
但是我们考虑能不能一步换出来 即(i+1)给小的那个数 (i+1+1)%2==0即可 即(i+2)%2==0即可,否则的话就是两部 即把(i+1)给小的那个数, (i+1)/2给小的那个数
接下来是代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 typedef long long ll; 7 using namespace std; 8 const int maxn=110; 9 int t; 10 ll a,b,d; 11 int main(){ 12 scanf("%d",&t); 13 while(t--){ 14 scanf("%lld%lld",&a,&b); 15 if(a==b){printf("0\n");continue;} 16 d=abs(a-b); 17 ll q=0; 18 for(ll i=1;;i++){ 19 ll s=(i*(i+1))/2; 20 if(s>d) break; 21 q=i; 22 } 23 ll ans=q; 24 d=d-((q*(q+1))/2); 25 // 5 26 if(d==0){cout<<ans<<endl;continue;} 27 q++; 28 ll sum=q-d; 29 // cout<<sum<<" "<<q<<endl; 30 while(sum%2!=0){q++;sum+=q;} 31 cout<<q<<endl; 32 } 33 return 0; 34 }