很久没做就悲剧了~
A:
比较简单,就直接判断即可。
代码:
<pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=100;
int n,v,ans[maxn],cnt;
int main()
{
while(scanf("%d%d",&n,&v)!=EOF)
{
cnt=0;
for(int i=1;i<=n;i++)
{
int m;
scanf("%d",&m);
bool is=false;
while(m--)
{
int val;
scanf("%d",&val);
if(!is&&v>val)
{
is=true;
ans[cnt++]=i;
}
}
}
printf("%d\n",cnt);
for(int i=0;i<cnt;i++)
printf("%d%c",ans[i],i==cnt-1?'\n':' ');
}
return 0;
}
B:
因为题目要求说尽量保证收到的水果最多,那么最好的方法就是把所有相同一天的水果全部合并,然后用贪心的思路求一下就行了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5001;
struct Node
{
int a;
int b;
bool operator < (const Node &s)const{
if(a==s.a)
return b>s.b;
return a<s.a;
}
}a[maxn],b[maxn];
int n,v;
int main()
{
while(scanf("%d%d",&n,&v)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d%d",&b[i].a,&b[i].b);
sort(b,b+n);
int m=0;
a[m].a=b[0].a;
a[m++].b=b[0].b;
for(int i=1;i<n;i++)
if(b[i].a==b[i-1].a)
a[m-1].b+=b[i].b;
else
{
a[m].a=b[i].a;
a[m++].b=b[i].b;
}
a[m].a=a[m-1].a+1;
a[m++].b=0;
int ans=0,res=0;
if(a[0].b>v)
{
res=a[0].b-v;
ans=v;
}
else
ans=a[0].b;
for(int i=1;i<m;i++)
{
//printf("SSSS %d %d\n",i,ans);
if(a[i].a==a[i-1].a+1)
{
if(res>v)
{
ans+=v;
res=a[i].b;
}
else
{
ans+=min(res+a[i].b,v);
res=max(0,a[i].b-(v-res));
}
}
else
{
ans+=min(res,v);
res=0;
ans+=min(a[i].b,v);
res=max(0,a[i].b-v);
}
}
printf("%d\n",ans);
}
return 0;
}
C:
C题稍稍麻烦一点,其实不难想到每次除了最后一个以外,每个都分配2个,我是根据每行为奇数和偶数分开处理的~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=310;
int n,m,k;
bool vis[maxn][maxn];
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(m&1)
{
int sx=1,sy=1;
bool is=false;
memset(vis,0,sizeof(vis));
for(int i=0;i<k-1;i++)
{
if(!is)
{
printf("2");
printf(" %d %d %d %d\n",sx,sy,sx,sy+1);
vis[sx][sy]=vis[sx][sy+1]=1;
sx++;
if(sx==n+1)
{
sx=1;
sy+=2;
}
if(sy==m)
{
is=true;
}
}
else
{
printf("2");
printf(" %d %d %d %d\n",sx,sy,sx+1,sy);
vis[sx][m]=vis[sx+1][m]=1;
sx+=2;
}
}
printf("%d",n*m-2*(k-1));
bool flag=0;
if((n+1-sx)&1)
flag=1;
for(int i=n;i>=1;i--)
{
if(flag)
{
for(int j=1;j<=m;j++)
if(!vis[i][j])
printf(" %d %d",i,j);
flag=1-flag;
}
else
{
for(int j=m;j>=1;j--)
if(!vis[i][j])
printf(" %d %d",i,j);
flag=1-flag;
}
}
printf("\n");
}
else
{
memset(vis,0,sizeof(vis));
int sx=1,sy=1;
for(int i=0;i<k-1;i++)
{
printf("2");
printf(" %d %d %d %d\n",sx,sy,sx,sy+1);
vis[sx][sy]=vis[sx][sy+1]=1;
sy+=2;
if(sy==m+1)
{
sx++;
sy=1;
}
}
printf("%d",n*m-2*(k-1));
bool flag=1;
for(int i=sx;i<=n;i++)
{
if(flag)
{
for(int j=1;j<=m;j++)
if(!vis[i][j])
printf(" %d %d",i,j);
flag=1-flag;
}
else
{
for(int j=m;j>=1;j--)
if(!vis[i][j])
printf(" %d %d",i,j);
flag=1-flag;
}
}
printf("\n");
}
}
return 0;
}