#include<bits/stdc++.h>#define int long longusingnamespace std;constint N =1e6+7;constint mod =1e9+7;int t,n,m,k;int a[N];signedmain(){
cin>>t;while(t--){
cin>>n>>m;
n --;if(n ==0){
cout<<0<<endl;continue;}if(n ==1){
cout<<m<<endl;}if(n >1){
cout<<2*m<<endl;}}return0;}
B. Two Arrays And Swaps
题意:两个数组,可以把数组b的元素和数组a的交换,可以交换最多x个。
思路:显然,用b最大的替换a最小的。如果b中的还没有a中的大那就不用换了。
AC代码:
#include<bits/stdc++.h>#define int long longusingnamespace std;constint N =1e6+7;constint mod =1e9+7;int t,n,m,k;int a[N],b[N];signedmain(){
cin>>t;while(t--){
cin>>n>>m;for(int i =0; i < n ; i ++) cin>>a[i];for(int i =0; i < n ; i ++) cin>>b[i];int sum =0;for(int i =0; i < n ; i ++) sum += a[i];sort(a,a+n);sort(b,b+n);int pos =0;for(int i = n-1; i >=0&& m;pos ++, m--, i --){if(b[i]> a[pos]){
sum += b[i]-a[pos];}}
cout<<sum<<endl;}return0;}
#include<bits/stdc++.h>#define int long longusingnamespace std;constint N =1e6+7;constint mod =1e9+7;int t,n,m,k;int a[N],b[N];signedmain(){
cin>>t;while(t--){
cin>>n;int cnt =8;int sum =0;int tmp =1;for(int i =3; i <= n ; i +=2){
sum += cnt*tmp;
cnt +=8;
tmp ++;}
cout<<sum<<endl;}return0;}
#include<bits/stdc++.h>#define int long longusingnamespace std;//const int N = 1e6+7;constint N =1e6+10;constint mod =998244353;int t,n,m,k;int a[N],b[N];int res[N];int cnt[N];int dp[N][2];
string s;signedmain(){
cin>>t;while(t--){
cin>>n>>k;
cin>>s;for(int i =1; i <= n ; i ++){
dp[i][0]= dp[i][1]=0;
cnt[i]= cnt[i-1]+ s[i-1]-'0';}for(int i =1; i <= n ; i ++){int p =max(0LL,i-k);
dp[i][0]=min(dp[i-1][0],dp[i-1][1])+s[i-1]-'0';
dp[i][1]=min(cnt[i-1],dp[p][1]+cnt[i-1]-cnt[p])+(s[i-1]=='0');}
cout<<min(dp[n][0],dp[n][1])<<endl;}return0;}
#include<bits/stdc++.h>#define int long longusingnamespace std;constint N =1e6+10;constint mod =998244353;int t,n,m,k;int a[105][105];int dp[105][105];int res[N];
string s;signedmain(){
cin>>t;while(t--){
cin>>n>>m;for(int i =0; i < n ; i ++){for(int j =0; j < m ; j ++){
cin>>a[i][j];}}int pre = a[0][0];int res =1e18;for(int i =0; i < n ; i ++){for(int j =0; j < m ; j ++){int now = a[i][j]-i-j;if(now > pre){continue;}for(int x =0; x < n ; x ++){for(int y =0; y < m ; y ++){
dp[x][y]=1e18;}}
dp[0][0]= pre-now;for(int x =0; x < n ; x ++){for(int y =0; y < m ; y ++){int noww = now+x+y;if(a[x][y]>= noww){int cnt = a[x][y]- noww;if(x >0) dp[x][y]=min(dp[x][y],dp[x-1][y]+cnt);if(y >0) dp[x][y]=min(dp[x][y],dp[x][y-1]+cnt);}}}
res =min(res,dp[n-1][m-1]);}}
cout<<res<<endl;}return0;}