CodeForces - 1355
A - Sequence with Digits
加着加着数据中肯定会出现0这个数字,那么就一直加0,直接输出当前数据即可。int t;
ll n,k;
bool is(ll x)
{while(x){if (x%10==0)return true;x/=10;}return false;
}
ll solve(ll x)
{int minn=9,maxx=0;while(x){int res=x%10;minn=min(minn,res);maxx=max(maxx,res);x/=10;}return minn*maxx;
}
int main()
{scanf("%d",&t);while(t--){scanf("%lld%lld",&n,&k);rep(i,1,k-1){if (is(n))break;n+=solve(n);}WW(n);}return 0;
}
B - Young Explorers
排序之后,当加入某个人后当前队伍人数正好等于他的能力值
那么这个队伍就是最优队伍,接下来的另起一支队伍。int t,n,a[maxn];
int main()
{scanf("%d",&t);while(t--){int ans=0,num=0;scanf("%d",&n);rep(i,1,n)scanf("%d",&a[i]);sort(a+1,a+1+n);rep(i,1,n){num++;if (num==a[i]){ans++;num=0;}}W(ans);}return 0;
}
C - Count Triangles
n^2必然超时,显然只能从遍历最多一条边。先确定最长边z枚举x+y的值,假设x+y=i(a+b<=i<=b+c)由于需要满足x+y>z,所以z<i
那么z的范围就是[c,min(i-1,d)]接下来的问题转化为能找到几组二元组(x,y)满足条件a<=x<=b<=y<=c,且x+y=i1.x属于[a,b]
2.x+y=i;
联立二式,得到y属于[i-b,i-a];
又y属于[b,c]
所以y属于[max(i-b,b),min(i-a,c)]对于每一个y,x都是确定的,即x=i-y
因此每一个i能够产生(len(y的区间)*len(z的区间))的贡献ll a,b,c,d,ans=0;
int main()
{scanf("%lld%lld%lld%lld",&a,&b,&c,&d);for (ll i=max(a+b,c);i<=b+c;i++){ll l=max(i-b,b);ll r=min(i-a,c);ans+=(r-l+1)*min(d-c+1,i-c);}WW(ans);return 0;
}
D - Game With Array
这n个数如何选择?这n个数中的数要尽量组成不同数字的情况少一些。
例如:一个和为6的数组中 1 2 3 肯定不如 1 1 4接下里盲猜如果这n个数分别为n-1个1,再加上一个s-n+1分情况讨论:
1.如果s-n+1>n,先手赢,即K=n,那么这n-1个1肯定无法组成n
这时他们想要求救于s-n+1,但是他一个人就已经超过了n
2.如果s-n+1<=n,后手赢,因为所有的情况都能被组成。int n,s;
int main()
{scanf("%d%d",&n,&s);if (s<=2*n-1)printf("NO\n");else{printf("YES\n");rep(i,1,n-1)printf("1 ");W(s-n+1);W(n);}return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!