头像

wkj


访客:2710

离线:3小时前



wkj
14天前

众所周知,一个中文字符占两个字节。
那么,C++中如何让中文字符只占一个数组位置?



活动打卡代码 AcWing 238. 银河英雄传说

wkj
4个月前
#include<bits/stdc++.h>
using namespace std;
int fa[30005];
int num_size[30005];
int d[30005];
int get(int x)
{
    if(fa[x]==x)return x;
    int root=get(fa[x]);
    d[x]+=d[fa[x]];
    return fa[x]=root; 
}
void merge(int x,int y)
{
    //printf("hahdahfkjsda\n");
    x=get(x),y=get(y);
    if(x==y)return;
    fa[x]=y;
    d[x]=num_size[y];
    //printf("%d\n",x);
    num_size[y]+=num_size[x];
}
int main()
{
    int T;
    for(int i=1;i<=30000;i++)
      fa[i]=i,num_size[i]=1;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        char c;
        int x,y;
        cin>>c;
        //printf("%c\n",c);
        scanf("%d%d",&x,&y);
        //printf("%d %d\n",x,y);
        if(c=='C'){
            if(get(x)!=get(y))puts("-1");
            else printf("%d\n",abs(d[x]-d[y])-1);
        }
        else merge(x,y);
        //printf("%d %d\n",d[get(x)],d[get(y)]);
    }
    return 0;
}


活动打卡代码 AcWing 467. 海港

wkj
4个月前
#include<bits/stdc++.h>
using namespace std;
struct people{
    int Time;
    int guo;
}a[300005];
int le=1,ri=0;
int cnt[300005];
int main()
{
    int n;
    scanf("%d",&n);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int t,k;
        scanf("%d%d",&t,&k);
        while(a[le].Time<=t-86400&&le<=ri){
            cnt[a[le].guo]--;
            if(cnt[a[le].guo]==0)ans--;
            le++;
        }
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&a[++ri].guo),a[ri].Time=t;
            cnt[a[ri].guo]++;
            if(cnt[a[ri].guo]==1)ans++;
        }  
        printf("%d\n",ans);
    }
}


活动打卡代码 AcWing 468. 魔法阵

wkj
4个月前
#include<bits/stdc++.h>
using namespace std;
int th[40005];
int cnt[15005];
int sum[15005];
int A[15005],B[15005],C[15005],D[15005];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)scanf("%d",&th[i]),cnt[th[i]]++;
    int sum=0;
    for(int L=1;9*L+2<=n;L++)//A-B 2L  C-D L   B-C 6L+k
    {
        sum=0;
        for(int d=9*L+2;d<=n;d++)
        {
            int a=d-L*9-1;
            int b=a+2*L;
            int c=d-L;
            sum+=cnt[a]*cnt[b];
            C[c]+=sum*cnt[d];
            D[d]+=sum*cnt[c];
        }
        sum=0;
        for(int a=n-L*9-1;a>=1;a--)
        {
            int b=a+2*L;
            int c=a+8*L+1;
            int d=c+L;
            sum+=cnt[d]*cnt[c];
            A[a]+=sum*cnt[b];
            B[b]+=sum*cnt[a];
        }
    }
    for(int i=1;i<=m;i++)
      printf("%d %d %d %d\n",A[th[i]],B[th[i]],C[th[i]],D[th[i]]);
}


活动打卡代码 AcWing 91. 最短Hamilton路径

wkj
4个月前
#include<bits/stdc++.h>
using namespace std;
int f[1<<20][20];
int d[20][20];
int n;
int ham()
{
    memset(f,0x3f,sizeof f);
    f[1][0]=0;
    for(int s=1;s<(1<<n);s++)
    {
        for(int i=0;i<n;i++)
          if(s>>i&1)
            for(int j=0;j<n;j++)
            {
                int k=1<<j;
                if((s&k)==0)f[s|k][j]=min(f[s|k][j],f[s][i]+d[i][j]);
            } 
          //  for(int k=0;k<n;k++)
          //    if((s^1<<i)>>k&1)f[s][i]=min(f[s][i],f[s^1<<i][k]+d[k][i]);
    }
    return f[(1<<n)-1][n-1];
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        scanf("%d",&d[i][j]);
    printf("%d\n",ham());
    return 0;
} 


活动打卡代码 AcWing 122. 糖果传递

wkj
4个月前
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[1000005];
int main()
{
    int n;
    scanf("%d",&n);
    ll sum=0;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]),sum+=a[i];
    ll ave=sum/n;
    for(int i=n;i>1;i--)a[i]=ave-a[i]+a[i+1];
    a[1]=0;
    sort(a+1,a+n+1);
    ll res=0;
    for(int i=1;i<=n;i++)res+=abs(a[i]-a[(n+1)/2]);//与中点的距离
    printf("%lld",res);
    return 0;
}


活动打卡代码 AcWing 96. 奇怪的汉诺塔

wkj
4个月前
#include<bits/stdc++.h>
using namespace std;
int f[100];
int d[100];
int main()
{
    memset(f,0x3f,sizeof f);
    d[1]=1;
    f[1]=1;
    for(int i=2;i<=12;i++)
    {
        for(int j=1;j<i;j++)
          f[i]=min(2*f[j]+d[i-j],f[i]);
        d[i]=2*d[i-1]+1;
    }
    for(int i=1;i<=12;i++)printf("%d\n",f[i]);
}


活动打卡代码 AcWing 95. 费解的开关

wkj
4个月前
#include<bits/stdc++.h>
using namespace std;
char a[10][10];
char b[10][10];
int ans=-1;
void change(int x,int y)
{
    b[x][y]='1'-b[x][y]+'0';
    b[x-1][y]='1'-b[x-1][y]+'0';
    b[x+1][y]='1'-b[x+1][y]+'0';
    b[x][y-1]='1'-b[x][y-1]+'0';
    b[x][y+1]='1'-b[x][y+1]+'0';
}
int solve()
{
    int ans=1<<10;
    for(int k=0;k<=31;k++)
    {
        for(int i=1;i<=5;i++)
          for(int j=1;j<=5;j++)
            b[i][j]=a[i][j];
        int res=0;
        for(int j=1;j<=5;j++)
          if(k>>(j-1)&1){
            res++;
            change(1,j);
          }
        for(int i=2;i<=5;i++)
        {
            for(int j=1;j<=5;j++)
              if(b[i-1][j]=='0'){
                res++;
                change(i,j); 
              }
        }
        bool ok=true;
        for(int j=1;j<=5;j++)
          if(b[5][j]=='0'){
            ok=false;
            break;
          }
        if(ok)ans=min(ans,res);
    }
    if(ans>6)return -1;
    return ans;
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        for(int i=1;i<=5;i++)cin>>a[i]+1;
        printf("%d\n",solve());
    }
    return 0;
} 


活动打卡代码 AcWing 1162. 公交换乘

wkj
6个月前
#include<bits/stdc++.h>
using namespace std;
struct bus{
    int price,t;
}q[100005];
bool b[100005];
int le=1,ri=0;
int main()
{
    int n;
    scanf("%d",&n);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        while(le<=ri && z-q[le].t>45)le++;
        if(x==0){
            ans+=y;
            q[++ri].price=y;
            q[ri].t=z;
        }
        else{
            int pos=0;
            for(int j=le;j<=ri;j++)
              if(q[j].price>=y&&b[j]==0){
                pos=j;
                break;
              }
            if(pos==0)ans+=y;
            else b[pos]=1;
        }
    }
    printf("%d\n",ans);
    return 0;
}


活动打卡代码 AcWing 1161. 数字游戏

wkj
6个月前
#include<bits/stdc++.h>
using namespace std;
char a[9];
int main()
{
//  freopen("number.in","r",stdin);
//  freopen("number.out","w",stdout);
    scanf("%s",a+1);
    int ans=0;
    for(int i=1;i<=8;i++)if(a[i]=='1')ans++;
    printf("%d",ans);
    return 0;
}