このCFは本当に面白いです。 。 。
朝7時に起きたので、CFをするまでに17時間休んでおらず、プラス正午の5時間の試合がありました。
私の心はとても曖昧です。最初の問題を解いていたとき、フィールドの最大和を求めるものだと読みそうになりました。そして、それが水域であることに気づき、すぐに飛び降りました。
それから質問 B を読み始めました。最初は理解できず、私の頭はもう耐えられませんでした。すると突然、あるグループがDは水の質問だと言いました。
D を見てみました。どうぞ、D の質問の意味はとても簡単です。 。 。 。それで、一生懸命考えたんです。 。 。 。 。ほぼ1時
まで、まだ結果はありませんでした。 。 。この時点で、もう無理だと感じました。 。 Dのことを諦めたかったので、もう一度Bに会いに行きました。問題を注意深く読んだ後、問題 B が本当の水の問題であることがわかりました。 。しばらく憂鬱な気分になります。 。
質問 A:
間隔を乱暴に列挙し、列挙によっていくつかの数値を削除することができます。
数を数えるときは、最初に最小の数を削除し、次に最大の数を入力する必要があります。
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<vector>using namespace std;#define maxn 220000#define mem(a,b) memset(a,b,sizeof(a))int a[222];vector<int>vec;vector<int>vecc;int main(){ int n,m,ans,i,j,k; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++)scanf("%d",&a[i]); ans=a[1]; for(i=1;i<=n;i++) { int p=0; for(j=i;j<=n;j++) { vec.clear(); vecc.clear(); p=0; for(k=i;k<=j;k++) { vec.push_back(a[k]); p+=a[k]; } for(k=1;k<=n;k++) { if(k<i||k>j)vecc.push_back(a[k]); } sort(vec.begin(),vec.end()); sort(vecc.begin(),vecc.end()); int len=vec.size(); ans=max(ans,p); for(k=1;k<=m&&k<=len&&k<=vecc.size();k++) { p-=vec[k-1]; p+=vecc[vecc.size()-k]; ans=max(ans,p); } } } cout<<ans<<endl; } return 0;}
質問 B:
この質問を注意深く研究すると、合法にしたい場合は、任意の 2 つの行または列が同じまたは反対の状態でなければならないことがわかります。
次に、m が 10 未満の場合、最初の行のステータスを列挙します。
m が 10 より大きい場合、変更されていない列を列挙します。 ❤️