比赛链接: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 }