1. 程式人生 > >幾道cf水題

幾道cf水題

們的 表示 水題 牢固 coloring clas cin ostream nbsp

題意:給你包含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;
 } 

幾道cf水題