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 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 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"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 }
View Code

 

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 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 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<continue;}
27         q++;
28         ll sum=q-d;
29        // cout<
30         while(sum%2!=0){q++;sum+=q;}
31         cout<endl;
32     }
33     return 0;
34 }
View Code

你可能感兴趣的:(Codeforces1278 (Edu Div2))