A
给一排升序排序的数字,给数字涂色,要求去掉某个颜色之外的所有数,该颜色的数,呈严格递增,就是不重复的升序。
只有一个数的时候也符合题意。
要求使用最少的颜色数。
题解思路
就是记录出现次数最多的数。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int vis[200];
int main ()
{
int t;
cin>>t;
while(t--)
{
memset(vis , 0 , sizeof(vis) );
int n,ans = 0 ;
cin>>n;
for (int i = 1 ; i <= n ; i++ )
{
int p;
cin>>p;
vis[p]++;
if ( vis[p] > ans )
ans = vis[p];
}
cout<<ans<<"\n";
}
return 0;
}
B
给出一个数D , 再给出数 Q,如果Q能被含D的数 组成 ,这称这个数是好数。多个好数之和也是好数
判断一个数是否是好数。
题解思路
想搜索,但是1e9必然超时
所以,没思路了。
结果发现可以找规律的。
当小于10D的时候,判断X是否满足 10a+bd ,直接对数取模出个位,和取出位10的几倍。
当个位不为D的倍数时,尝试不断从10倍数借位,因为bd是有可能大于10 的。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main ()
{
int t;
cin>>t;
while(t--)
{
int n , d ;
cin>>n>>d;
for (int i = 1 ; i <= n ; i++ )
{
int p ;
cin>>p;
if ( p >= 10*d)
{
cout<<"YES\n";
}else
{
int t1 = p/10;
p = p%10;
if ( p != 0 && p % d == 0 )
{
cout<<"YES\n";
continue;
}else
{
int flag = 0;
while(t1)
{
t1--;
p += 10;
if ( p % d == 0 )
{
flag = 1;
break;
}
}
if (flag)
cout<<"YES\n";
else
cout<<"NO\n";
}
}
}
}
return 0;
}