A题:纯白送
#include<stdio.h>
int main()
{
int t,a;
scanf("%d",&t);
while(t--)
{
scanf("%d",&a);
if(a%4)
{
printf("NO\n");
}
else
printf("YES\n");
}
}B题:
先从最后的1开始,如果它后面不是1也不是末尾,那么判断:如果它后面是连续2个0就消去第一个,直至遇到1。此时消除原来的1。
!!注意,这个解法被hack了。要注意到如果进行到最前面的1,且它前面有0后面只剩最后一个0时,这时候要变成1而不是0。这样就可以和前面的0进一步消除。
!!题解暂未更新
#include<stdio.h>
int main()
{
int t,a,p[100000]={0},add,n,add2,swi;
char c;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
c=getchar();
for(add=0;add<n;add++)
{
c=getchar();
p[add]=c-'0';
}
p[n]=-1;
for(add=n-2;add>=0;add--)
{
swi=0;
if(p[add]==1)
{
for(add2=add+1;add2<n&&p[add2]!=1;add2++)
{
p[add2]=-1;
swi=1;
}
if(swi)
{
p[add2-1]=0;
p[add]=-1;
}
}
}
for(add=0;add<n;add++)
{
if(p[add]!=-1)
printf("%d",p[add]);
}
printf("\n");
}
}C题:首先把数和每个人需要的数量排序。给每个人分配一个最大的数,然后按需要的数量从小到大分配从大到小的数。这样可以使被浪费的数尽可能小。
#include<stdio.h>
#include<iostream>
#include<algorithm>
long long p[200000],w[200000];
using namespace std;
int main()
{
long long t,n,k,sum,mem;
long long add,add2;
scanf("%lld",&t);
while(t--)
{
scanf("%lld %lld",&n,&k);
for(add=0;add<n;add++)
scanf("%lld",&p[add]);
for(add=0;add<k;add++)
scanf("%lld",&w[add]);
sort(p,p+n);
sort(w,w+k);
sum=0;
add2=n-1;
for(add=0;w[add]==1&&add<k;add++)
{
sum+=p[add2]*2;
add2--;
//printf("[1 %lld]",sum);
}
mem=add;
for(;add<k;add++)
{
sum+=p[add2];
add2--;
//printf("[2 %lld]",sum);
}
for(add=mem;add<k;add++)
{
sum+=p[add2-w[add]+2];
//printf("[3 %lld %lld %lld]",sum,add2,p[add2]);
add2-=w[add]-1;
}
printf("%lld\n",sum);
}
}D题:思维题。注意到f(n)=2f(n-2)+f(n-1)+4(n%3==0)就可以了,很有意思的一道题。
#include<stdio.h>
long long p[2000001];
int main()
{
long long t,add,q;
p[1]=0;
p[2]=0;
for(add=3;add<=2000000;add++)
{
p[add]=p[add-2]*2+p[add-1];
if(add%3==0)
p[add]+=4;
p[add]=p[add]%1000000007;
}
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&q);
printf("%lld\n",p[q]);
}
return 0;
}
京公网安备 11010502036488号