Codeforce Round #538(Div2)

比赛链接:https://codeforces.com/contest/1114

B.(字丑求轻喷QAQ)

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pii pair<int,int>
 4 using namespace std;
 5 const int maxn=2e5+6;
 6 vector<pii>v;
 7 int n,m,k;
 8 int main()
 9 {
10     cin>>n>>m>>k;
11     for(int i=1;i<=n;++i)
12     {
13         int a;cin>>a;
14         v.push_back(make_pair(a,i));
15     }
16     sort(v.begin(),v.end(),greater<pii>());
17     ll sum=0;
18     vector<int>div;
19     for(int i=0;i<m*k;++i)
20     {
21         sum+=v[i].first;
22         div.push_back(v[i].second);
23     }
24     cout<<sum<<endl;
25     sort(div.begin(),div.end());
26     for(int i=m-1;i<div.size()-1;i+=m)
27     {
28         printf("%d ",div[i]);
29     }
30     return 0;
31 }

    

C.

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll n,b;
 5 int main()
 6 {
 7     cin>>n>>b;
 8     ll ans=1e18;
 9     for(ll i=2;i<=b;++i)
10     {
11         ll cnt=0;
12         if(i*i>b) i=b;
13         while(b%i==0) {cnt++;b/=i;}
14         if(cnt==0) continue;
15         ll tmp=0,base=1;            //    ll tmp=0;base=i;
16         while(base<=n/i)            //    while(base<=n)
17         {                            //    {
18             base*=i;                //        tmp+=n/base;
19             tmp+=n/base;            //        base*=i;
20         }                            //    }
21         ans=min(ans,tmp/cnt);        //    这样看起来更好理解,但是...爆了long long,要修改
22     }
23     cout<<ans<<endl;
24 }

 4.

一道dp问题(据说有LCS做法,我还没学会emmmm)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5e3+6;
 4 int dp[maxn][maxn][2];
 5 int col[maxn];
 6 int main()
 7 {
 8     int n; cin>>n;
 9     for(int i=1;i<=n;i++)
10     {
11         cin>>col[i];
12     }
13     for(int i=0;i<maxn;++i) for(int j=0;j<maxn;++j){dp[i][j][0]=1e9;dp[i][j][1]=1e9;} //初始化
14     for(int i=0;i<maxn;++i) {dp[i][i][0]=0;dp[i][i][1]=0;}
15     for(int i=n;i>=1;i--) for(int j=i+1;j<=n;j++)
16     {
17         dp[i][j][0]=min({dp[i][j][0],dp[i+1][j][0]+(col[i]!=col[i+1]),dp[i+1][j][1]+(col[i]!=col[j])});
18         dp[i][j][1]=min({dp[i][j][1],dp[i][j-1][1]+(col[j-1]!=col[j]),dp[i][j-1][0]+(col[i]!=col[j])});
19         // 更容易理解的做法:                                                                      //先求解向前扩展
20         // int t0=min( dp[i+1][j][0]+ !(col[i]==col[i+1]) , dp[i+1][j][1]+ !(col[i]==col[j])); //t0表示位置 [i+1][j] 的最小值
21         // dp[i][j][0]=min(dp[i][j][0],t0);                                                    //dp[i][j][0]为 min(位置[i+1][j],位置[i][j])
22                                                                                                //向后扩展是一样的
23         // int t1=min( dp[i][j-1][1]+ !(col[j]==col[j-1]) , dp[i][j-1][0]+ !(col[i]==col[j]));
24         // dp[i][j][1]=min(dp[i][j][1],t1);                                         
25         //对于 dp[i+1][j][1]+ !(col[i]==col[j]) 和 dp[i][j-1][0]+ !(col[i]==col[j]) 的解释:
26         //拿第一个作为例子,dp[i+1][j][1]是向右扩展的,所以比较标准是右端的col[j],而不是之前的col[i]和col[i+1]比较
27     }
28     cout<<min(dp[1][n][0],dp[1][n][1]);
29     return 0;
30 }

  

原文地址:https://www.cnblogs.com/codeoosacm/p/10374135.html