Codeforces Round #452 (Div. 2)

Codeforces Round #452 (Div. 2)

题目链接:http://codeforces.com/contest/899

 

已过ABC题,待更。

A题题意:给N个组,每个组有1个或两个人,问能组成多少个三人组。

A题题解:贪心的思想,统计出两个人和一个人的组数X和Y,肯定先选一个两人组和一个一个组组合。那么三人组个数就是X+(X-Y)/3。

AC代码:

 1 #include<iostream>
 2 using namespace std;
 3 int n,sum1,sum2;
 4 int main()
 5 {
 6     cin>>n;
 7     for(int i=1;i<=n;i++)
 8     {
 9         int x;
10         cin>>x;
11         if(x==1)sum1++;
12         else sum2++;
13     }
14     if(sum2>sum1)cout<<sum1<<endl;
15     else cout<<sum2+(sum1-sum2)/3<<endl;
16 }

B题题意:给定最多24个月的天数,问是否符合实际。

B题题解:因为不一定从第一个月开始,所以最多24个月就可以从36个循环里找是否存在一个子循环符合要求。

因为三年里最多一个29天,所以需要更改三次二月份的天数。

AC代码:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int a[37],b[25],n;
 5 int pe()
 6 {
 7     int ok = 0;
 8     for(int i=1;i<=36-n;i++)
 9     {
10         if(b[1]==a[i])
11         {
12             int k = 1;
13             while(k<n)
14             {
15                 if(a[i+k]!=b[k+1])break;
16                 k++;
17             }
18             if(k==n)ok=1;
19         }
20     }
21     return ok;
22 }
23 int main()
24 {
25     for(int i=1;i<=7;i++)
26     {
27         if(i&1)a[i]=31;
28         else a[i]=30;
29     }
30     for(int i=8;i<=12;i++)
31     {
32         if(i&1)a[i]=30;
33         else a[i]=31;
34     }
35     for(int i=13;i<=36;i++)a[i]=a[i-12];
36     cin>>n;
37     for(int i=1;i<=n;i++)
38     {
39         cin>>b[i];
40     }
41     int ok = 0;
42     a[2]=a[14]=a[26]=28;
43     ok = max(ok,pe());
44     a[2]=29;
45     ok = max(ok,pe());
46     a[2]=28;
47     a[14]=29;
48     ok = max(ok,pe());
49     a[14]=28;
50     a[26]=29;
51     ok = max(ok,pe());
52     if(ok)cout<<"Yes"<<endl;
53     else cout<<"No"<<endl;
54 }

C题题意:给从1-N的N个数,分成两组使得两组和的差最小,输出其中一组的个数和组里的每个数。

C题题解:一开始跑了一下,发现差是11001100的顺序,然后分4种情况wa了,发现N大了的时候组里的每个数规律是不定的。然后就贪心的思想了,从N往下找,找到就减去,记录找到的每个数即可。

AC代码:

 1 #include <iostream>
 2 using namespace std;
 3 const int maxn = 60007;
 4 int n,vis[maxn],now;
 5 int main(int argc, char const *argv[])
 6 {
 7     cin>>n;
 8     now = 0;
 9     int sum;
10     if(n&1)sum = (n+1)/2*n;
11     else sum = n/2*(n+1);
12     sum/=2;
13     for(int i=n;i>=1;i--)
14     {
15         if(sum>=i)
16         {
17             sum-=i;
18             vis[now++]=i;
19         }
20     }
21     if(n%4==0||n%4==3)cout<<sum<<endl;
22     else cout<<sum+1<<endl;
23     cout<<now<<" ";
24     for(int i=0;i<now;i++)
25     {
26         cout<<vis[i]<<" ";
27     }
28     cout<<endl;
29     return 0;
30 }
原文地址:https://www.cnblogs.com/sortmin/p/8089445.html