好久都没有打过cf了,昨天打的第一场毫无疑问的爆零了.....原来我还是这么的菜啊...
废话少说了,开始补题目:
A:Problem - A - Codeforces (Unofficial mirror by Menci)
A题就是找规律啊....然后我就死活不肯找规律,如果字符串的字母都一样,那么输出-1,如果字符串的字符不都一样,那么输出字符串的长度-1;下面是正确代码;
在说一说我的思路,一开始看的时候我看不到回文的那个单词,所以看了好久题目,看了好久,终于看懂题目了,然后就开始思考,一开始我想到了单层双向循环,感觉不对,然后就想到了区间dp求最长回文子序列,然后这题求的是最长不回文子序列,比如aaa吧,答案为0,然后我们把dp[i][i]赋值为0,对于dzzd,答案为3,我们输出为2,反正就是不好写了.....
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<stack>
#include<deque>
#include<vector>
#include<map>
#include<set>
#include <utility>
using namespace std;
typedef long long ll ;
#define pii pair<int,int>
const int inf = 0x3f3f3f3f;//106110956
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
void print(__int128 num) {
if(num) {
print(num/10);
putchar(num%10+'0');
}
}
string s;
int dp[55][55];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(dp,0,sizeof(dp));
cin>>s;
int ans=0;
for(int len=2;len<=s.length();len++){
for(int i=0;i+len-1<=s.length()-1;i++){
int j=i+len-1;
if(s[i]==s[j])dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
else{
dp[i][j]=dp[i+1][j-1]+2;
}
ans=max(ans,dp[i][j]);
}
}
if(ans==0){
printf("-1\n");
}else{
if(ans==s.length()){
printf("%d\n",ans-1);
}else{
printf("%d\n",ans);
}
}
}
return 0;
}
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<stack>
#include<deque>
#include<vector>
#include<map>
#include<set>
#include <utility>
using namespace std;
typedef long long ll ;
#define pii pair<int,int>
const int inf = 0x3f3f3f3f;//106110956
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
void print(__int128 num) {
if(num) {
print(num/10);
putchar(num%10+'0');
}
}
string s;
int main(){
int t;
scanf("%d",&t);
while(t--){
cin>>s;
int cnt=1;
for(int i=1;i<=s.length()-1;i++){
if(s[i]==s[i-1]){
cnt++;
}else{
break;
}
}
if(cnt==s.length()){//打表找规律...
printf("-1\n");
}else{
printf("%d\n",s.length()-1);
}
}
return 0;
}
B:Problem - B - Codeforces (Unofficial mirror by Menci)
真的英文题目读懂题目好难啊,好多单词都认识但是连起来就不知道啥意思了;
这题我考虑了比较久吧,然后有了点思路,然后样例有几个用我的做法没对,然后我就开始做了,其实是我少考虑了一种情况,有两种情况,一是把最大值放在(1,1),然后让最小的两个值放在(1,2)和(2,1)注意此时需要比较n和m的大小,让最小值放在n和m大的一行或者一列;
第二种情况我没有考虑,就是把最小值放在(1,1),把第一大的和第二大的放在(1,2)和(2,1),同理需要考虑n,m;
两种方法最后都需要加上(n*m-n-m+1)*(最大值-最小值)
我的代码如下,但是出现了Idleness limit exceeded on test 3;蒙圈....
ac代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
const int N = 2e5 + 5;
ll T;
ll n, m;
ll ans1, ans2;
ll b[N];
void solve() {
cin >> n >> m;
for (int i = 1; i <= n * m; i++) cin >> b[i];
sort(b + 1, b + n * m + 1);
ll ma = b[n * m], mi1 = b[1], mi2 = b[2];
ans1 = 0;
ans1 += (ma - mi1) * (n - 1) * (m - 1);
ans1 += (ma - max(mi1, mi2)) * (min(n, m) - 1);
ans1 += (ma - min(mi1, mi2)) * (max(n, m) - 1);
ll mi = b[1], ma1 = b[n * m], ma2 = b[m * n - 1];
ans2 = 0;
ans2 += (ma1 - mi) * (n - 1) * (m - 1);
ans2 += (max(ma1, ma2) - mi) * (max(n, m) - 1);
ans2 += (min(ma1, ma2) - mi) * (min(n, m) - 1);
cout << max(ans1, ans2) << endl;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
T = 1;
cin >> T;
while (T--) solve();
return 0;
}
继续加油!!!!