B:一定是奇数个颜色,且中间的颜色的个数+1就是答案。其他都是不可能的。
C:枚举那个人竞选成功即可
L:先处理1-K行。 一行一行进行处理,第一列直接从小到大,第二列往后,判断前一列与第k个字符串的那一列的字符相同的位置最上面在哪,然后从上往下填字典序小的字符。依次类推填好后再填剩下的就行。先填的是个倒三角
以上是签到题。。
J:枚举屏幕大小,屏幕大小一定小于等于最小的图标数+1.
再枚举图标种类,看看当前大小能否装下所有种类图标,可以的话就记录数量,取最小即可。
复杂度0(n),因为最小的图标数*图标种类一定小于等于n。
#include
using namespace std;
typedef long long ll;
//typedef __int128 LL;
//typedef unsigned long long ull;
//#define F first
//#define S second
typedef long double ld;
typedef pair pii;
typedef pair pll;
typedef pair pdd;
const ld PI=acos(-1);
const ld eps=1e-9;
//unordered_mapmp;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
//#define a(i,j) a[(i)*(m+2)+(j)] //m是矩阵的列数
//pop_back()
const int seed=131;
const int M = 2e6+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y,int z){ee[++cnt].nxt=head[x],ee[cnt].to=y,ee[cnt].val=z,head[x]=cnt;}
*/
int mp[M];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,x;
scanf("%d",&n);
for(int i=1;i<=n;i++)mp[i]=0;
vectorv;v.clear();
for(int i=1;i<=n;i++)
scanf("%d",&x),mp[x]++;
int s=n+1;
for(int i=1;i<=n;i++)
if(mp[i])v.pb(mp[i]),s=min(s,mp[i]);
//sort(v.begin(),v.end());
int mi=n+1;
for(int i=1;i<=s+1;i++)//屏幕的大小
{
int ans=0;
for(auto x:v)//枚举所有种类,看看每个种类是否满足
{
int z=x/i;
int c=x%i;
if(c+z>=i-1||c==0)//可以
ans+=z+(c!=0);
else {
ans=-1;
break;
}
}
if(ans>0)mi=min(mi,ans);
// cout<
K;
思路基本都在代码里了。
要明确:一个序列只能对应一个数,一个数也只能对应一个序列。(位置顺序固定的序列)
这一题就转化为了求满足条件的序列个数-1.
条件:
1.第i位的数要小于i+1。//第i位是一个数除以i+1的余数
2.最后一位不能为0,//商不可能为0
#include
using namespace std;
typedef long long ll;
//typedef __int128 LL;
//typedef unsigned long long ull;
//#define F first
//#define S second
typedef long double ld;
typedef pair pii;
typedef pair pll;
typedef pair pdd;
const ld PI=acos(-1);
const ld eps=1e-9;
//unordered_mapmp;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
//#define a(i,j) a[(i)*(m+2)+(j)] //m是矩阵的列数
//pop_back()
const int seed=131;
const int M = 2e6+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y,int z){ee[++cnt].nxt=head[x],ee[cnt].to=y,ee[cnt].val=z,head[x]=cnt;}
*/
int s[50],sz;
ll cal()
{
//如果s序列固定对应的数只有一个
//同时数固定对应的s序列也只有一个
//我们现在计算满足条件的序列有几个就是计算数有几个
//条件:设第i位是第i次操作的结果,则s[i]