程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> TC SRM 553 DIV2

TC SRM 553 DIV2

編輯:C++入門知識

赤裸裸的又在送rate。
250PT:
可以列個方程組,然後解方程,唯一解,也可以枚舉兩個,寫得再爛再爛也有1000^2的上限,可以過。

500PT:
兩種情況,一種是將-1置為0,然後判斷是否能把最後一個數變為目標,如果可以的話,那麼0肯定是最小的選擇了。
另外就是直接模擬,然後判斷最後一個數是否比目標小,如果比目標小的話,就可以把-1轉變成那個差值-1。
貌似我還記錄了在模擬的過程中,-1的位置,這個應該沒有影響。。如果-1在前面的話,會在第一種情況就測試出。

1000PT:
哭 死,剛敲完就結束了,不應該嘗試搜索和貪心的
貪心是有反例的,如果直接排序的話,那麼
1 2 2 10
2
這組數據就過不了。
對於余數分為4組,然後再貪心也是錯的
{1,101,105,6,10} 2, ORZ  Dshawn神牛cha全場
正解是DP
同樣對於余數進行分組,可以在每一組內貪心
dp[a][b][c][d]表示每一組分別取了a,b,c,d個的最優解
貌似還有種做法是dp[i][j][k] 前i個數字取掉j個余數是k
[cpp] 
int dp[51][51][51][51]={0}; 
class SafeRemoval{ 
public: 
     int removeThem(vector <int> seq, int k){ 
         sort(seq.begin(),seq.end()); 
         vector<int>v[4]; 
         int n=seq.size(); 
         int sum=0; 
         for(int i=0;i<n;i++)  { 
             v[seq[i]%4].push_back(seq[i]); 
             sum+=seq[i]; 
         }           
         memset(dp,-1,sizeof(dp));  
         dp[0][0][0][0]=sum; 
         for(int i=0;i<k;i++){ 
             for(int a=0;a<=v[0].size();a++){ 
                 for(int b=0;b<=v[1].size();b++){ 
                     for(int c=0;c<=v[2].size();c++){ 
                         for(int d=0;d<=v[3].size();d++){ 
                         if(dp[a][b][c][d]==-1)  continue; 
                         if(a+b+c+d>i) continue; 
                         if(a<v[0].size()&&(dp[a][b][c][d]-v[0][a])%4) 
                            dp[a+1][b][c][d]=max(dp[a][b][c][d]-v[0][a],dp[a+1][b][c][d]); 
                          if(b<v[1].size()&&(dp[a][b][c][d]-v[1][b])%4) 
                             dp[a][b+1][c][d]=max(dp[a][b][c][d]-v[1][b],dp[a][b+1][c][d]); 
                        if(c<v[2].size()&&(dp[a][b][c][d]-v[2][c])%4) 
                            dp[a][b][c+1][d]=max(dp[a][b][c][d]-v[2][c],dp[a][b][c+1][d]); 
                        if(d<v[3].size()&&(dp[a][b][c][d]-v[3][d])%4) 
                            dp[a][b][c][d+1]=max(dp[a][b][c][d]-v[3][d],dp[a][b][c][d+1]); 
                         } 
                     } 
                 } 
             } 
         } 
         int ans=-1; 
         for(int a=0;a<=v[0].size();a++) 
           for(int b=0;b<=v[1].size();b++) 
             for(int c=0;c<=v[2].size();c++) 
                for(int d=0;d<=v[3].size();d++) 
                    if(a+b+c+d==k) 
                    ans=max(dp[a][b][c][d],ans); 
        return ans; 
     } 
}; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved