鉴于本人还是个CF黑名小菜鸟,可能写得格式不太好,思路也可能不清晰,
希望能有更多大牛指教指教,#452(DIV 2)还是可以做A 到C 。
A. Splitting in Teams
@2. 1可以随便组队, 但2就不能拆开。
分析: @1, 判断0的情况,
a、全是2 b、 或者 2个1
@2,判断1的情况,
只有可能 n=2, 1个1 和 1个2 3个1
@3,判断其他情况‘、
a、num 2 >= num 1 时只能由1来决定。
b、num 1>=num 2 先把2的全凑合,剩下的1/3.
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[1000000],vis[3]={0};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;
}
if((n==2&&vis[1]!=vis[2])||(vis[1]==0))
{
printf("0\n");
}
else if(n==2&&vis[1]==vis[2])
{
printf("1\n");
}
else if(vis[2]>=vis[1])
{
printf("%d\n",vis[1]);
}
else if(vis[1]>vis[2])
{
int ans=vis[2]+(vis[1]-vis[2])/3;
printf("%d\n",ans);
}
return 0;
}
B. Months and Years
题解:先介绍了别人的日历是和国际接轨之后,出了个 n<24 的范围来考我们这些月份是否合法的。
分析:菜鸟没啥好方法,就是懂得暴力求解,把36个月列出来,如果有29天的存在就要特判,
@1、29出现两次,直接不合法,
@2、29出现过一次的话,把36个月中的每个2月都更新一次,记得把原来的还原成28;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int b[36]=
{
31,28,31,30,31,30,31,31,30,31,30,31,
31,28,31,30,31,30,31,31,30,31,30,31,
31,28,31,30,31,30,31,31,30,31,30,31
};
int n,flag=0,a[30];
scanf("%d",&n);
int vis[35]={0};
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;
}
if(vis[29]==2)
{
printf("NO\n");
return 0;
}
else
{
int k,j;
for(int i=0;i<36&&!flag;i=k+1)
{
k=i;
if(vis[29]==1)
{
b[1]=29;
b[13]=28;
b[25]=28;
}
int count=0;
j=0;
while(b[i]==a[j]&&j<n)
{
count++;
i++;j++;
}
if(count==n)
{
flag=1;
}
}
for(int i=0;i<36&&!flag;i=k+1)
{
k=i;
if(vis[29]==1)
{
b[1]=28;
b[13]=29;
b[25]=28;
}
int count=0;
j=0;
while(b[i]==a[j]&&j<n)
{
count++;
i++;j++;
}
if(count==n)
{
flag=1;
}
}
for(int i=0;i<36&&!flag;i=k+1)
{
k=i;
if(vis[29]==1)
{
b[1]=28;
b[13]=28;
b[25]=29;
}
int count=0;
j=0;
while(b[i]==a[j]&&j<n)
{
count++;
i++;j++;
}
if(count==n)
{
flag=1;
}
}
if(flag==1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
C. Dividing the numbers
题解:就是把 1到n 分两份,
第一行输出是 两份求和后 之间的差值,
第二行符合条件的一份 先一个 个数 后是 符合条件的一组数。
做这题时吃了文化的亏,any of them 让我好好琢磨了半天。
才知道原来输出符合条件的一组就可以了。
分析:看图
#include<bits/stdc++.h>
int main()
{
int i,n,ans[60050];
while(~scanf("%d",&n))
{
if(n%2==0)
{
if((n/2)%2==1)
{
printf("1\n%d ",n/2);
int cnt=1;
for(i=3;i<=n/2&&n!=2;i++)
{
if(i%2==1)
{
ans[cnt++]=i;
ans[cnt++]=n-i+3;
}
}
if(n==2)
{
printf("1\n");
}
else
{
printf("1 ");
}
for(i=1;i<cnt;i++)
{
printf(i==cnt-1?"%d\n":"%d ",ans[i]);
}
}
else
{
printf("0\n%d ",n/2);
int cnt=1;
for(i=1;i<=n/2;i++)
{
if(i%2==1)
{
ans[cnt++]=i;
ans[cnt++]=n-i+1;
}
}
for(i=1;i<cnt;i++)
{
printf(i==cnt-1?"%d\n":"%d ",ans[i]);
}
}
}
else
{
if(((n-1)/2)%2==1)
{
printf("0\n%d ",n/2);
int cnt=1;
int k=n+3;
for(i=4;i<=k/2;i++)
{
if(i%2==0)
{
ans[cnt++]=i;
ans[cnt++]=k-i+1;
}
}
printf(n==3?"3\n":"3 ");
for(i=1;i<cnt;i++)
{
printf(i==cnt-1?"%d\n":"%d ",ans[i]);
}
}
else
{
printf("1\n%d ",n/2);
int cnt=1;
for(i=2;i<=n/2;i++)
{
if(i%2==0)
{
ans[cnt++]=i;
ans[cnt++]=n-i+2;
}
}
for(i=1;i<cnt;i++)
{
printf(i==cnt-1?"%d\n":"%d ",ans[i]);
}
}
}
}
return 0;
}