其他分享
首页 > 其他分享> > 12月补题记(3)

12月补题记(3)

作者:互联网

鸽了几天,它终于还是如期而至!(等会儿,这句话它是不是有语病?

先来看周练(二)
B题:
看了一眼题目,果断跳过。原因有二,一是题目太长,英语又不好,看个题说不定比做题还久。二是因为它大致讲的是连连看游戏,当时估计挺难的,毕竟连来连去可不是好惹的。
后面回头一看,其实非常简单,如果你使用可能会产生重复操作的暴力法来解决,那么将会迅速ac。
但是我就是犯贱,一心想着通过重复最少甚至没有重复来解决这题,于是就在样例非常小时出现了bug(找了好久,呜呜呜呜)。
数据不用long long,我当时以为bug在这儿。。。
代码如下:

#include<iostream>

using namespace std;
#define ll long long
const int N=35;
ll a[N][N];
bool is_tf(int n,int m){
    for(int i=0;i<n-1;i++)
for(int j=0;j<m-1;j++)
    if(a[i][j]==a[i][j+1]||a[i][j]==a[i+1][j])
        return 1;

    for(int i=0;i<m-1;i++)
            for(int j=i+1;j<m;j++)
            if(a[0][i]==a[0][j]||a[n-1][i]==a[n-1][j])return 1;
        for(int i=0;i<n-1;i++)
            for(int j=i+1;j<n;j++)
            if(a[i][0]==a[j][0]||a[i][n-1]==a[j][n-1])return 1;

return 0;
}
int main(){
    int t;
	cin>>t;
	for(int k=1;k<=t;k++){
            int n,m;
        cin>>n>>m;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            cin>>a[i][j];

        printf("Case #%d: ",k);
        if(is_tf(n,m))cout<<"Yes\n";
        else cout<<"No\n";
	}
	return 0;
}

C题:
这题绝对算得上是一道陷阱题。本来我也曾为它冥思苦想过,然后发现复杂度怎么都要10^9,还不论指数。
但是我发现它的修饰词用的是more than(超过)
那么两个连续不同的字符不就满足条件吗?因为他们是相等,并没有超过。抱着试一试的态度提交了代码,然后ac了。。。。。。
代码如下:

#include <iostream>
using namespace std;
string s;
int is_tf(){
    int n;
   cin>>n>>s;
    for(int i=1;i<s.size();i++){
        if(s[i]!=s[i-1])return i;
    }
    printf("NO");
    return 0;
}
int main(){
    int ans;
    if(ans=is_tf())
        printf("YES\n%c%c",s[ans-1],s[ans]);
}

I题:
这题我没有尝试过就搜答案了。
因为题目没有看懂。。。
不过这题收获确实蛮大的!
知道了什么叫做前缀和,知道了怎样构造前缀和,知道了怎样使用前缀和。
然后讲一下题意和解题思路:
题意:找面积最大的子矩阵,并且保证该子矩阵的元素和不超过一个给点的值。
解题思路:因为该题中特殊的矩阵构造方式,让我们很容易想到子矩阵元素的和满足分配律,从而使用前缀和求解。
代码如下:(自己写的)

#include<bits/stdc++.h>

#define inf 0x3f3f3f3f
using namespace std;
const int N=2005;
int mia[N],mib[N];
int* pre(int c[],int n,int mic[]){
    c[0]=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&c[i]);
        c[i]+=c[i-1];
    }
    for(int i=1;i<=n;i++)mic[i]=inf;
    for(int i=1;i<=n;i++)
    for(int j=0;j<i;j++)
    mic[i-j]=min(mic[i-j],c[i]-c[j]);
    return mic;
}
int main(){
    int a[N],b[N],mia[N],mib[N],n,m;
    cin>>n>>m;
    pre(a,n,mia);
    pre(b,m,mib);
    int x;
    cin>>x;
    int ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
                if(mia[i]<=x/mib[j])
                ans=max(ans,i*j);
    }
    cout<<ans;
	return 0;
}

这里多嘴一句,该题中涉及大面积初始化数组的任务,但是我并没有使用memset()函数,原因可以参看下面这篇memset()函数详解:
https://blog.csdn.net/Adenson/article/details/102510196

标签:12,int,cin,long,mia,ans,tf,题记
来源: https://blog.csdn.net/sanxiucao/article/details/110734802