跳转至

十六届 JavaA 组暴力

第一题

数位倍数

5分
#include<bits/stdc++.h>
using namespace std;

bool check(int x){
    int res=0;
    while(x!=0){
        res+=x%10;
        x/=10;
    }
    return res%5==0;
}

int main(){
    int ans=0;
    for(int i=1;i<=202504;i++){
        if(check(i)) ans++;
    }
    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {

    static boolean check(int x){
        int res=0;
        while(x!=0){
            res+=x%10;
            x/=10;
        }
        return res%5==0;
    }

    public static void main(String[] args){
        int ans=0;
        for(int i=1;i<=202504;i++){
            if(check(i)) ans++;
        }
        System.out.print(ans);
    }
}
ans=0

def check(x):
    res=0
    while x!=0:
        res+=x%10
        x//=10
    return res%5==0

for i in range(1,202505):
    if check(i):
        ans+=1

print(ans)

第二题

2025

5分
#include<bits/stdc++.h>
using namespace std;

bool check(int x){
    int cnt[10]={0};
    while(x!=0){
        cnt[x%10]++;
        x/=10;
    }
    return cnt[2]>=2 && cnt[0]>=1 && cnt[5]>=1;
}

int main(){
    int ans=0;
    for(int i=1;i<=20250412;i++){
        if(check(i)) ans++;
    }
    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {

    static boolean check(int x){
        int[] cnt=new int[10];
        while(x!=0){
            cnt[x%10]++;
            x/=10;
        }
        return cnt[2]>=2 && cnt[0]>=1 && cnt[5]>=1;
    }

    public static void main(String[] args){
        int ans=0;
        for(int i=1;i<=20250412;i++){
            if(check(i)) ans++;
        }
        System.out.print(ans);
    }
}
ans=0

def check(x):
    cnt=[0]*10
    while x!=0:
        cnt[x%10]+=1
        x//=10
    return cnt[2]>=2 and cnt[0]>=1 and cnt[5]>=1

for i in range(1,20250413):
    if check(i):
        ans+=1

print(ans)

第三题

变换数组

10分
#include<bits/stdc++.h>
using namespace std;

const int N=1010;
int a[N],n,m;

int bitcount(int x){
    int cnt=0;
    while(x){
        cnt+=x%2;
        x/=2;
    }
    return cnt;
}

int main(){
    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    cin>>m;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            a[i]=bitcount(a[i])*a[i];
        }
        cout<<a[i]<<" ";
    }

    return 0;
}
import java.util.*;

public class Main {

    static final int N=1010;
    static int[] a=new int[N];

    static int bitcount(int x){
        int cnt=0;
        while(x!=0){
            cnt+=x%2;
            x/=2;
        }
        return cnt;
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        int n=sc.nextInt();

        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
        }

        int m=sc.nextInt();

        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                a[i]=bitcount(a[i])*a[i];
            }
            System.out.print(a[i]+" ");
        }
    }
}
import sys
input=sys.stdin.readline

def bitcount(x):
    cnt=0
    while x:
        cnt+=x%2
        x//=2
    return cnt

n=int(input())
a=list(map(int,input().split()))
m=int(input())

for i in range(n):
    for _ in range(m):
        a[i]=bitcount(a[i])*a[i]
    print(a[i],end=" ")

第四题

最短距离

10分
#include<bits/stdc++.h>
using namespace std;

const int N=50010;
int a[N],b[N],n;

int main(){
    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }

    sort(a+1,a+n+1);
    sort(b+1,b+n+1);

    long long ans=0;

    for(int i=1;i<=n;i++){
        ans+=abs(a[i]-b[i]);
    }

    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {

    static final int N=50010;
    static int[] a=new int[N];
    static int[] b=new int[N];

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        int n=sc.nextInt();

        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
        }
        for(int i=1;i<=n;i++){
            b[i]=sc.nextInt();
        }

        Arrays.sort(a,1,n+1);
        Arrays.sort(b,1,n+1);

        long ans=0;

        for(int i=1;i<=n;i++){
            ans+=Math.abs(a[i]-b[i]);
        }

        System.out.print(ans);
    }
}
import sys
input=sys.stdin.readline

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))

a.sort()
b.sort()

ans=0
for i in range(n):
    ans+=abs(a[i]-b[i])

print(ans)

第五题

冷热数据队列

15分(理论12分)
#include<bits/stdc++.h>
using namespace std;

int n1,n2,m;
const int N=1e4+10;

int cnt1[N],cnt2[N];
vector<int> q1,q2;

void insertFront(vector<int> &v,int p){
    v.insert(v.begin(),p);
}

void removePos(vector<int> &v,int p){
    v.erase(v.begin()+p);
}

void check(int p){
    if(cnt2[p]==0 && cnt1[p]==0){
        cnt2[p]=1;
        insertFront(q2,p);
        if(q2.size()>n2){
            cnt2[q2[n2]]=0;
            q2.pop_back();
        }
    }else{
        if(cnt2[p]==1){
            cnt2[p]=0;
            for(int i=0;i<q2.size();i++){
                if(q2[i]==p){
                    removePos(q2,i);
                    break;
                }
            }
        }else{
            for(int i=0;i<q1.size();i++){
                if(q1[i]==p){
                    removePos(q1,i);
                    break;
                }
            }
        }

        cnt1[p]=1;
        insertFront(q1,p);

        if(q1.size()>n1){
            int t=q1[n1];
            q1.pop_back();
            cnt1[t]=0;

            if(q2.size()<n2){
                cnt2[t]=1;
                insertFront(q2,t);
            }
        }
    }
}

int main(){
    cin>>n1>>n2;
    cin>>m;

    for(int i=1;i<=m;i++){
        int x;
        cin>>x;
        check(x);
    }

    for(int v:q1) cout<<v<<" ";
    cout<<"\n";
    for(int v:q2) cout<<v<<" ";

    return 0;
}
import java.util.*;

public class Main {

    static int n1,n2,m;
    static final int N=10010;

    static int[] cnt1=new int[N];
    static int[] cnt2=new int[N];

    static ArrayList<Integer> q1=new ArrayList<>();
    static ArrayList<Integer> q2=new ArrayList<>();

    static void insertFront(ArrayList<Integer> v,int p){
        v.add(0,p);
    }

    static void removePos(ArrayList<Integer> v,int p){
        v.remove(p);
    }

    static void check(int p){
        if(cnt2[p]==0 && cnt1[p]==0){
            cnt2[p]=1;
            insertFront(q2,p);
            if(q2.size()>n2){
                cnt2[q2.get(n2)]=0;
                q2.remove(n2);
            }
        }else{
            if(cnt2[p]==1){
                cnt2[p]=0;
                for(int i=0;i<q2.size();i++){
                    if(q2.get(i)==p){
                        removePos(q2,i);
                        break;
                    }
                }
            }else{
                for(int i=0;i<q1.size();i++){
                    if(q1.get(i)==p){
                        removePos(q1,i);
                        break;
                    }
                }
            }

            cnt1[p]=1;
            insertFront(q1,p);

            if(q1.size()>n1){
                int t=q1.get(n1);
                q1.remove(n1);
                cnt1[t]=0;

                if(q2.size()<n2){
                    cnt2[t]=1;
                    insertFront(q2,t);
                }
            }
        }
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        n1=sc.nextInt();
        n2=sc.nextInt();
        m=sc.nextInt();

        for(int i=1;i<=m;i++){
            int x=sc.nextInt();
            check(x);
        }

        for(int v:q1) System.out.print(v+" ");
        System.out.println();
        for(int v:q2) System.out.print(v+" ");
    }
}
import sys
input=sys.stdin.readline

N=10010
cnt1=[0]*N
cnt2=[0]*N

q1=[]
q2=[]

def insert_front(v,p):
    v.insert(0,p)

def remove_pos(v,p):
    v.pop(p)

def check(p):
    if cnt2[p]==0 and cnt1[p]==0:
        cnt2[p]=1
        insert_front(q2,p)
        if len(q2)>n2:
            cnt2[q2[n2]]=0
            q2.pop()
    else:
        if cnt2[p]==1:
            cnt2[p]=0
            for i in range(len(q2)):
                if q2[i]==p:
                    remove_pos(q2,i)
                    break
        else:
            for i in range(len(q1)):
                if q1[i]==p:
                    remove_pos(q1,i)
                    break

        cnt1[p]=1
        insert_front(q1,p)

        if len(q1)>n1:
            t=q1[n1]
            q1.pop()
            cnt1[t]=0
            if len(q2)<n2:
                cnt2[t]=1
                insert_front(q2,t)

n1,n2=map(int,input().split())
m=int(input())

arr = list(map(int, input().split()))
for x in arr:
    check(x)

print(*q1)
print(*q2)

第六题

拼好数

10.5分(官方数据有100个测试点,测试请自重)
#include<bits/stdc++.h>
using namespace std;

int n,a[25],c[25];
int dp[1<<20];
bool vis[1<<20];

int dfs(int mask){
    if(vis[mask]) return dp[mask];
    vis[mask]=1;

    int ans=0;

    int i=0;
    while(i<n && (mask>>i&1)) i++;
    if(i==n) return dp[mask]=0;

    ans=max(ans, dfs(mask|(1<<i)));

    if(c[i]>=6) ans=max(ans, 1+dfs(mask|(1<<i)));

    for(int j=i+1;j<n;j++){
        if(mask>>j&1) continue;
        if(c[i]+c[j]>=6){
            ans=max(ans, 1+dfs(mask|(1<<i)|(1<<j)));
        }
    }

    for(int j=i+1;j<n;j++){
        if(mask>>j&1) continue;
        for(int k=j+1;k<n;k++){
            if(mask>>k&1) continue;
            if(c[i]+c[j]+c[k]>=6){
                ans=max(ans, 1+dfs(mask|(1<<i)|(1<<j)|(1<<k)));
            }
        }
    }

    return dp[mask]=ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
        int x=a[i];
        while(x){
            if(x%10==6) c[i]++;
            x/=10;
        }
    }

    cout<<dfs(0)<<"\n";
    return 0;
}
import java.util.*;

public class Main {

    static int n;
    static int[] a=new int[25];
    static int[] c=new int[25];

    static int[] dp=new int[1<<20];
    static boolean[] vis=new boolean[1<<20];

    static int dfs(int mask){
        if(vis[mask]) return dp[mask];
        vis[mask]=true;

        int ans=0;

        int i=0;
        while(i<n && ((mask>>i)&1)==1) i++;
        if(i==n) return dp[mask]=0;

        ans=Math.max(ans, dfs(mask|(1<<i)));

        if(c[i]>=6) ans=Math.max(ans, 1+dfs(mask|(1<<i)));

        for(int j=i+1;j<n;j++){
            if(((mask>>j)&1)==1) continue;
            if(c[i]+c[j]>=6){
                ans=Math.max(ans, 1+dfs(mask|(1<<i)|(1<<j)));
            }
        }

        for(int j=i+1;j<n;j++){
            if(((mask>>j)&1)==1) continue;
            for(int k=j+1;k<n;k++){
                if(((mask>>k)&1)==1) continue;
                if(c[i]+c[j]+c[k]>=6){
                    ans=Math.max(ans, 1+dfs(mask|(1<<i)|(1<<j)|(1<<k)));
                }
            }
        }

        return dp[mask]=ans;
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        n=sc.nextInt();
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
            int x=a[i];
            while(x!=0){
                if(x%10==6) c[i]++;
                x/=10;
            }
        }

        System.out.println(dfs(0));
    }
}
import sys
input=sys.stdin.readline

n=int(input())
a=list(map(int,input().split()))
c=[0]*n

for i in range(n):
    x=a[i]
    while x:
        if x%10==6:
            c[i]+=1
        x//=10

dp=[0]*(1<<n)
vis=[False]*(1<<n)

def dfs(mask):
    if vis[mask]:
        return dp[mask]
    vis[mask]=True

    i=0
    while i<n and (mask>>i)&1:
        i+=1
    if i==n:
        dp[mask]=0
        return 0

    ans=dfs(mask|(1<<i))

    if c[i]>=6:
        ans=max(ans,1+dfs(mask|(1<<i)))

    for j in range(i+1,n):
        if (mask>>j)&1:
            continue
        if c[i]+c[j]>=6:
            ans=max(ans,1+dfs(mask|(1<<i)|(1<<j)))

    for j in range(i+1,n):
        if (mask>>j)&1:
            continue
        for k in range(j+1,n):
            if (mask>>k)&1:
                continue
            if c[i]+c[j]+c[k]>=6:
                ans=max(ans,1+dfs(mask|(1<<i)|(1<<j)|(1<<k)))

    dp[mask]=ans
    return ans

print(dfs(0))

第七题

甘蔗

1分
#include<iostream>
using namespace std;

int main(){
    cout<<-1;
    return 0;
}
public class Main {
    public static void main(String[] args){
        System.out.print(-1);
    }
}
print(-1)
2分
#include<bits/stdc++.h>
using namespace std;

int n,m;
const int N=1010;

int cntb[N];
int a[N],b[N],h[N];

bool calc(){
    for(int i=1;i<=n-1;i++){
        int d=abs(h[i]-h[i+1]);
        if(cntb[d]==0) return false;
    }
    return true;
}

int ans=1010;

void dfs(int u,int cnt){
    if(u==n+1){
        if(calc()){
            ans=min(ans,cnt);
        }
        return;
    }

    h[u]=a[u];
    dfs(u+1,cnt);

    for(int i=0;i<a[u];i++){
        h[u]=i;
        dfs(u+1,cnt+1);
    }
}

int main(){
    cin>>n>>m;

    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    for(int i=1;i<=m;i++){
        cin>>b[i];
        cntb[b[i]]=1;
    }

    dfs(1,0);

    if(ans==1010) ans=-1;
    cout<<ans;

    return 0;
}
import java.util.*;

public class Main {

    static int n,m;
    static final int N=1010;

    static int[] cntb=new int[N];
    static int[] a=new int[N];
    static int[] b=new int[N];
    static int[] h=new int[N];

    static int ans=1010;

    static boolean calc(){
        for(int i=1;i<=n-1;i++){
            int d=Math.abs(h[i]-h[i+1]);
            if(cntb[d]==0) return false;
        }
        return true;
    }

    static void dfs(int u,int cnt){
        if(u==n+1){
            if(calc()){
                ans=Math.min(ans,cnt);
            }
            return;
        }

        h[u]=a[u];
        dfs(u+1,cnt);

        for(int i=0;i<a[u];i++){
            h[u]=i;
            dfs(u+1,cnt+1);
        }
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        n=sc.nextInt();
        m=sc.nextInt();

        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
        }

        for(int i=1;i<=m;i++){
            b[i]=sc.nextInt();
            cntb[b[i]]=1;
        }

        dfs(1,0);

        if(ans==1010) ans=-1;
        System.out.print(ans);
    }
}
import sys
input=sys.stdin.readline

N=1010
cntb=[0]*N

n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))
b=list(map(int,input().split()))

for x in b:
    cntb[x]=1

h=[0]*(n+1)
ans=1010

def calc():
    for i in range(1,n):
        d=abs(h[i]-h[i+1])
        if cntb[d]==0:
            return False
    return True

def dfs(u,cnt):
    global ans
    if u==n+1:
        if calc():
            ans=min(ans,cnt)
        return

    h[u]=a[u]
    dfs(u+1,cnt)

    for i in range(a[u]):
        h[u]=i
        dfs(u+1,cnt+1)

dfs(1,0)

if ans==1010:
    ans=-1

print(ans)

第八题

原料采购

1分
#include<iostream>
using namespace std;

int main(){
    cout<<-1;
    return 0;
}
public class Main {
    public static void main(String[] args){
        System.out.print(-1);
    }
}
print(-1)