A. Nezzar and Colorful Balls
分析: 贪心题,就是最少拦截系统这道题的变形。每判断一个数字时,如果有颜色的最大值比他小,则更新颜色的最大值,否则新建一个颜色,使最大值更新为这个数。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int t,n,a,x[N];
int main(){
cin>>t;
while(t--){
int i=0;
int cnt=1;
memset(x,0,sizeof(x));
cin>>n;
for(int i=0;i<n;i++){
int flag=0;
cin>>a;
for(int j=0;j<cnt;j++){
if(a>x[j]){
x[j]=a;
flag=1;
break;
}
}
if(!flag) x[cnt++]=a;
}
cout<<cnt<<endl;
}
}
B. Nezzar and Lucky Number
分析: a ≥ 10 ∗ d a\ge 10*d a≥10∗d时必定有解, a < 10 ∗ d a< 10*d a<10∗d时打暴力即可。
证明: 对于大于 10 ∗ d 10*d 10∗d的任意一个数,先让他减去某个数 k k k使他的个位数变为 d d d,然后只需要拿出十位数的一个 10 ∗ d + k 10*d+k 10∗d+k就可以了。
代码:
#include<stdio.h>
const int N=1e4+5;
int t,q,d;
long long int a;
int dfs(int x){
if(x==0) return 1;
for(int i=0;i<x/d;i++){
if(dfs(x-i*10-d)) return 1;
}
return 0;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&q,&d);
for(int i=0;i<q;i++){
scanf("%d",&a);
if(a>=10*d){
printf("YES\n");
continue;
}
if(dfs(a)) printf("YES\n");
else printf("NO\n");
}
}
}