幾道cf水題
阿新 • • 發佈:2019-01-18
們的 表示 水題 牢固 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水題