zoukankan      html  css  js  c++  java
  • B. Phoenix and Beauty(贪心构造)

    (给定序列长n的数组和k。完美数组的定义是数组中每一个连续k项的子段和为定值)
    (现在要求插入一些数使得数组满足条件,输出你构造的新数列.)

    (color{Red}{---------------------分割线!!hehehe----------------------})

    (这题其实很友好了,在原题中一直提醒你不必构造最短的数列!!!这意味着有方法可以很简单的构造出来。)

    (当数组中数的种类大于k是一定不能构造的,那我们现在考虑小于k的情况。(下面的数组a是假定构造完的数列))

    (定值为a[1]到a[k]的子段和,说明a[2]到a[k+1]也等于这个定值,所以a[k+1]==a[1])

    (那么现在很简单,我们只需要a[1]到a[k]就可以一直往后构造(一个循环节))

    (a[1]到a[k]用原数组中互不相同的数字填充,不够的话你随便添加什么都可以啦~然后就一直构造n次......)

    #include <bits/stdc++.h>
    using namespace std;
    int n,k,t;
    int a[10009],vis[109],tt[10009];
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		memset(vis,0,sizeof(vis));
    		cin>>n>>k;
    		int num=0;
    		for(int i=1;i<=n;i++)
    		{
    			cin>>a[i];
    			if(vis[a[i]]==0)
    				vis[a[i]]=1,tt[++num]=a[i];
    		}
    		if(num>k)	cout<<-1;
    		else
    		{
    			for(int i=num+1;i<=k;i++)	tt[i]=tt[i-1];
    			for(int i=k+1;i<=9999;i++)	tt[i]=tt[i-k];//构造n次就够了,这里我直接暴力9999 
    			cout<<9999<<endl;
    			for(int i=1;i<=9999;i++)	cout<<tt[i]<<" ";
    		}
    		cout<<endl;
    	}
    }
    
  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12818663.html
Copyright © 2011-2022 走看看