给你一堆无序的数组,这些数分别会在不同的天数掉下来(ai在第i天掉下来)。让你输出这个数组成的数塔。要求从下到上是递减的,并且输出每天组成的数塔的元素,如果该天不能组成数塔,就输出空行。
因为数塔由下到上是递减的,所以只有当最大的数字掉下来的时候,才能够开始组成数塔。由此递推,当一个数掉下来时,判断这个数到最大数之间所有的数是否都已经掉下来了,如果都掉下来了,就把这些都输出,反之则输出空行。
#include
using namespace std;
int s[100002];
bool compare(int a,int b)
{
return a>b;
}
int main()
{
int n,j=1;
cin>>n;
int print[100002]={0};
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
int a=n;
for(int i=1;i<=n;i++)
{
print[s[i]]=1;
for(int k=a;k>=1;k--)
{
if(print[k]==1)
{
cout<" ";
a--;
}
if(print[k]==0)break;
}
cout<return 0;
}
一个地方在ts到tf-1的时段是开门的,服务每个人需要k的时间。给出n个人和他们来排队的时间。规定如果你和一个人同时到达,你会屈服。。会排到到后面一位。要你求最小的等待时间。
要求等待的最小时间,有n个人,那么只有n+1中方案,即排在每个人的前面一分钟或后面。只要遍历这些点,并求出最小的等待时间就可以了。
#include
using namespace std;
int main()
{
long long ts,tf,t,n,pai,minn=1e12,ans;
cin>>ts>>tf>>t;
cin>>n;
for(int i=n;i>=1;i--)
{
cin>>pai;
if(pai&&pai<=tf-t)
{
long long j=max(pai-1,ts);
if(j<=tf-t&&ts-pai+11;
ans=min(pai-1,ts);
}
ts=max(ts,pai)+t;
}
}
if(ts<=tf-t)ans=ts;
cout<return 0;
}
简单来说,就是给你一棵树,让你把这颗树分成3段,每段的所有节点的和都相等。让你求是否有这种方案。如果有,就输出切割的点,如果没有就输出-1。
这题可以不用建树,用邻接表也同样可以做出来。只要从一个叶子节点向上遍历,搜索到这个节点的和路径上的所有点的和达到一定值就记录该节点,并将ans归零,继续搜索。如果搜索完之后只搜索到一个切割的带你,就输出-1,否则输出切割的两个点。
#include
#define maxn 1000050
using namespace std;
int n,sum,l,tem[maxn],ans,x=0,f[maxn],cut=0,node,cut1;
struct tree
{
int next;
int to;
}a[maxn];
void add(int c,int d)
{
x++;
a[x].to=d;
a[x].next=f[c];
f[c]=x;
}
void dfs(int c)
{
int d=c;
c=f[c];
while(c!=-1)
{
dfs(a[c].to);
tem[d]+=tem[a[c].to];
c=a[c].next;
// cout<
}
if(tem[d]==ans&&d!=node)
{
if(cut==0)
{
cut++;
tem[d]=0;
cut1=d;
}
else
{
cut++;
cout<" " <exit(0);
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
memset(f,-1,sizeof(f));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&l,&tem[i]);
if(l!=0)
add(l,i);
if(l==0)
node=i;
ans+=tem[i];
}
// cout<<"node="<
if(ans%3!=0)
{
printf("-1\n");
exit(0);
}
else ans=ans/3;
dfs(node);
// cout<
if(cut!=2)
{
printf("-1\n");
exit(0);
}
}
冰箱里有一些牛奶,超市里也有一些牛奶。每瓶牛奶都有一个保质期,问你在牛奶保质期之内,是否能够将冰箱里的牛奶喝完。如果可以,问最大能够从商店里买来几瓶牛奶,同样在保质期前喝完。
首先先判断一遍冰箱里的牛奶能否喝完,在把超市里的牛奶按保质期从大到小排序(当然是和保质期长的牛奶更能满足题目要求呀),二分超市里的牛奶,搜索能够买的最大的牛奶的数量。
#include
#define maxn 10000001
using namespace std;
int n,m,k;
int f[maxn];
int c[maxn*2];
int print[maxn];
struct milk
{
int date;
int x;
}a[maxn];
bool compare(milk a,milk b)
{
return a.date>b.date;
}
bool j(int a[],int b)
{
int d=0;
int cont=0;
for(int i=1;i<=b;i++)
{
if(d>a[i])return false;
cont++;
if(cont==k)
{
cont=0;
d++;
}
}
return true;
}
bool shop(int mid)
{
int x=0;
for(int i=1;i<=n;i++)
{
x++;
c[x]=f[i];
}
for(int i=1;i<=mid;i++)
{
x++;
c[x]=a[i].date;
}
sort(c+1,c+1+x);
if(j(c,x)==true)
{
for(int i=1;i<=mid;i++)
{
print[i]=a[i].x;
}
return true;
}
else return false;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%d",&f[i]);
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i].date);
a[i].x=i;
}
sort(f+1,f+1+n);
sort(a+1,a+1+m,compare);
if(j(f,n)==false)
{
printf("-1\n");
return 0;
}
int cnt=0;
int left=1;
int right=m;
while(right-left>=0)
{
int mid=(left+right)/2;
if(shop(mid)==true)
{
left=mid+1;
cnt=mid;
}
else
{
right=mid-1;
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%d ",print[i]);
}
printf("\n");
return 0;
}
这又是昨天的题目,表示题目很多根本补不完啊。现在还剩下dp的3题,群赛的2题没有补,这么看来,周六要跑死了啊。加油吧,坚持你的补题之路,微博也要坚持写下去。
继续贴出吴老师的话:学信息的人永不服输!!!