zoukankan      html  css  js  c++  java
  • 几道cf水题

    题意:给你包含n个元素的数组和k种元素,要求k种元素要用完,并且每种颜色至少用一次,n个元素,如果某几个元素的值相同,这些个元素也不能染成同一种元素。

    思路:如果元素个数n小于k或者值相同的元素的个数大于k,那么一定无解,输出-1。用一个num[a[i]]记录每种相同值的元素出现次数,若大于k,无解。这道题的关键在于如何处理值相同的这些元素,可以用一个二维数组f[i][j]来表示状态,其中i表示对应元素值,j代表颜色。只要对于相同的i,j值不同就可以了。每个元素用什么颜色记录在一个数组ans[i]中,最后输出ans[i]就可以了。

    Array K-Coloring 
    
    #include<iostream>
    #include<cstdio>
    #include<string.h>
    #define maxn 5005
    using namespace std;
    int n,k,flag=0;
    int cnt=1;
    int a[maxn];
    int ans[maxn];
    int num[maxn]={0};
    int vis[maxn][maxn];
    int main()
    {
        cin>>n>>k;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
        cin>>a[i];
        num[a[i]]++;
        if(num[a[i]]>k)
        flag=1;
        }
        if(n<k||flag)
        cout<<"NO"; 
        else
        { 
               cout<<"YES"<<endl;
               for(int i=0;i<n;i++)
               {
                   if(cnt<=k)
                   {
                       ans[i]=cnt;
                       vis[cnt][a[i]]=1;
                       cnt++;
                   }
                   else
                   {
                         for(int j=1;j<=k;j++)
                         {
                             if(!vis[j][a[i]])
                             {
                                 ans[i]=j;
                                 vis[j][a[i]]=1;
                                 break;
                             }
                         }
                   }
               }
               for(int i=0;i<n;i++)
               printf("%d ",ans[i]);
        }
        return 0;
    }

    题意:这里有n个门,它们的初始耐劳度为a[i]。你每次能对门造成x的破坏,修理工能每次使门回复y的牢固度。你和修理工都采用最优策略,请问10的100次轮后你能破坏掉多少门。

    思路:你的最优策略是每次先打掉牢固度低于你破坏力的门,修理工的最优策略是每次先修牢固度低于你破坏力的门。那么如果x>y的话,这种情况下最坏的情形是x-y仅仅相差1,每扇门牢固度都是10^5,共有100扇门,这样100*10^5也远远比10^100小,则最后你一定能破坏所有门。相反若x<=y,你只能破坏掉最初牢固度小于你破坏力的门cnt,数量为(cnt+1)/2.当这些门破坏后,剩下的门你破坏哪个,修理工就修理哪一个,最后也破坏不了一扇门

    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    
    int cnt=0;
    int n,x,y;
    int a[105];
    
    int main()
    {
        cin>>n>>x>>y;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]<=x)
            cnt++;
        }
        if(x>y)
        cout<<n;
        if(x<=y)
        cout<<(cnt+1)/2;
        return  0;
     } 
  • 相关阅读:
    数学之道-微积分
    mysql join实现方式
    python pip源配置
    python使用tesseract-ocr完成验证码识别
    Linux和Windows下查看环境变量方法对比
    把大象装进冰箱的N种方法
    mysql 取当前日期对应的周一或周日
    window 安装 Twisted 遇到的问题
    Java泛型
    Android之Adapter用法总结
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10289605.html
Copyright © 2011-2022 走看看