头像

潘潘_the_panda




离线:5小时前



一、格式

memset(a,0,sizeof(a))
memset(a,0x3ffffff,sizeof(a))
memset(a,'a',sizeof(a))

二、字节问题
先试试long long 类型

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e2+1e3;
ll a[N];
signed main()
{
    memset(a,1,sizeof(a));
    for(ll i=1;i<=100;i++)cout<<a[i]<<"\n";
    return 0;
}

结果发现输出奇奇怪怪
在试试char类型

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e2+1e3;
char a[N];
signed main()
{
    memset(a,'1',sizeof(a));
    for(ll i=1;i<=100;i++)cout<<a[i]<<"\n";
    return 0;
}

结果发现全部都是1
这是为啥子呢?
解析




#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
ll n;
ll a[N];
signed main()
{
    while(cin>>n)
    {
        for(ll i=1;i<=n;i++)cin>>a[i];
        sort(a+1,a+n+1);
        cout<<a[n]<<" "<<a[1]<<"\n";
    }
}


活动打卡代码 AcWing 817. 数组去重

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
ll n,ans=1;
ll a[N];
signed main()
{
    cin>>n;
    for(ll i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(ll i=2;i<=n;i++)
        if(a[i]!=a[i-1])
            ans++;
    cout<<ans;
    return 0;
}



#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
ll n,ans=1;
ll a[N];
signed main()
{
    cin>>n;
    for(ll i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(ll i=2;i<=n;i++)
        if(a[i]!=a[i-1])
            ans++;
    cout<<ans;
    return 0;
}



思路

1.题中写有“n<=1000”,所以,输入的时候必须用string或char进行存储
2.题目中有“n<=1000”
即使每一位都为9,但和最大也只有9000
因此,自第二次求各个位的和之后,我们可以用ll,int等存储

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
string s;
ll n;
signed main()
{
    cin>>s;
    for(ll i=0;i<s.size();i++)n+=(s[i]-'0');
    while(n>=10)//不断缩位求和,知道n<10
    {
        ll ans=0;//记录新的缩位之和
        while(n!=0)ans+=(n%10),n/=10;
        n=ans;
    }
    cout<<n;
    return 0;
}



思路

1.任意两个数都可以组成一个算术数组
2.动态转移方程式:

if(a[j]-a[j-1]==a[j-1]-a[j-2])dp[j]=max(dp[j],dp[j-1]+1);

如果a[j]-a[j-1]==a[j-1]-a[j-2],则满足算术数组,dp[j]=max(dp[j],dp[j-1]+1);
dp[j]=dp[j]和没把a[j]放入算术数组的dp[j-1]的最长算术数组中,则当前以a[j]结尾的算术数组的长度最长为max(dp[j],dp[j-1]+1)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5*2+1e4;
ll t,n;
ll a[N];
signed main()
{
    cin>>t;
    for(ll i=1;i<=t;i++)
    {
        cin>>n;
        ll dp[N];
        for(ll j=1;j<=n;j++)
        {
            cin>>a[j];
            dp[j]=2;//任意两个数都可以组成一个算术数组
        }
        ll ans=0;
        for(ll j=3;j<=n;j++)
        {
            if(a[j]-a[j-1]==a[j-1]-a[j-2])dp[j]=max(dp[j],dp[j-1]+1);//动态转移方程式
            ans=max(dp[j],ans);
        }
        cout<<"Case #"<<i<<": "<<ans<<"\n";
    }
    return 0;
}



思路

不难发现,题目中写道:c[i][j]>=0
所以,从一个点出发,应当把其可以遍历的所有点都遍历完,可达最大值(该点出发的最大值)
另外,我们还可以发现,(x+1,y+1)与(x-1,y-1)在同一直线上
所以,出发点只有:第一列与第一行

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+1e2;
ll t,n;
ll a[N][N];
ll maxn,ans;
ll find(ll x,ll y)
{
    ll ans_=0;
    while(x<=n&&y<=n)
    {
        ans_+=a[x][y];
        x++,y++;
    }
    return ans_;
}//遍历
signed main()
{
    cin>>t;
    for(ll i=1;i<=t;i++)
    {
        maxn=0;
        cin>>n;
        for(ll j=1;j<=n;j++)
            for(ll x=1;x<=n;x++)
                cin>>a[j][x];
        for(ll j=1;j<=n;j++)
            ans=find(1,j),maxn=max(maxn,ans);//第一行
        for(ll j=1;j<=n;j++)
            ans=find(j,1),maxn=max(maxn,ans);//第一列
        cout<<"Case #"<<i<<": "<<maxn<<"\n";
    }
    return 0;
}



#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
ll n;
ll s[N];
signed main()
{
    cin>>n;
    for(ll i=1;i<=n;i++)
    {
        ll ans;
        cin>>s[1]>>s[2]>>s[3];
        sort(s+1,s+4);//虽然只有三个数,没必要sort
        ll a=s[1],b=s[2],c=s[3];//很稚嫩,但直观
        if(a==0&&b==0)ans=0;//情况1
        else if(a==0&&b==c)ans=1;//情况2
        else if(a==0&&b!=c)ans=2;//情况3
        else if(a+b==c)ans=2;//情况4
        else if(a==b||b==c)ans=2;//情况5
        else ans=3;//剩余情况
        //枚举所有情况
        cout<<ans<<"\n";
    }
    return 0;
}


新鲜事 原文

NOI online有人进去了吗?我进不去



#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
ll n,a[N],b[N],ans,maxn;
signed main()
{
    cin>>n;
    for(ll i=1;i<=n;i++)
    {
        cin>>a[i];
        b[a[i]]++;
        maxn=max(maxn,a[i]);
    }
    for(ll i=0;i<=maxn;i++)
    {
        ans+=(b[i]*b[i+1]);//若值为i的数有b[i]个,值为i+1的数有b[i+1],则ans+=(b[i]*b[i+1])(组合)
    }
    cout<<ans;
}