B
数字n,可不可以由11,111,1111,11111……数子组成
例如:33=11+11+11;
大于111的数字可以由111和11组成
#include<bits/stdc++.h>
using namespace std;
int main()
{
int p;
scanf("%d",&p);
while(p--)
{
int n,i,j,k=10,flog=0;
scanf("%d",&n);
while(n>10)
{
if(n%11==0||n%111==0)
{
printf("YES\n");
flog=1;
break;
}
n=n-111;
}
if(!flog)
{
printf("NO\n");
}
}
}
C2
题意:对于一堆物品,物品的权值有正有负,初始体力值为0,按顺序一个个考虑选或不选,如果权值为正,加体力,为负减体力,确保体力不为负的同时,选择最多的物品
使用优先队列,从小到大排序,将拿取物品值为负的放进队列,当遇到体力值不够的时候,从队列中弹出元素与其比较,看元素是否比准备拿取的物品小。
#include<bits/stdc++.h>
using namespace std;
int a[1000011];
int main()
{
int n;
scanf("%d",&n);
int i,j;
long long ans=0,sum=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
priority_queue<int ,vector<int>, greater<int> >q;
for(i=0;i<n;i++)
{
if(a[i]>=0)
{
ans++;
sum+=a[i];
}
else
{
if(sum+a[i]>=0)
{
ans++;
sum+=a[i];
q.push(a[i]);
}
else if(!q.empty())
{
int k=q.top();
if(-k+a[i]>=0)
{
q.pop();
sum=sum-k+a[i];
q.push(a[i]);
}
}
}
}
printf("%lld %lld\n",ans,sum);
}