头像

常山赵子龙


访客:1120

离线:5天前



50.png
帮帮孩子吧,谁能帮我做出来啊,有偿求大佬(第一个做出来的50)



活动打卡代码 AcWing 1424. 文具订购

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a,b,c,m;
ll q,w,e,t;
ll n;
void dfs(ll x,ll u,ll i,ll o){
    if(x>n) return ;
    else if(x==n){
        t=u<i?u:i;
        t=t<o?t:o;
        if(t>m){
            q=u;w=i;e=o;
            m=t;
            return ;
        }
        else if(t==m&&(u+i+o)>(q+w+e)){
            q=u;w=i;e=o;
            return ;
        }
        return ;
    }
    else{
        dfs(x+7,u+1,i,o);
        dfs(x+4,u,i+1,o);
        dfs(x+3,u,i,o+1);
    }
}
int main(){
    cin>>n;
    if(n<3) cout<<-1;
    else{
    ll k;
    if(n>=14){
     k=n/14;
     n=n%14;
    }
    dfs(0,0,0,0);

cout<<q+k<<" "<<w+k<<" "<<e+k;
}
} 



这个哈希表为啥不对啊

#include <bits/stdc++.h>
using namespace std;
int main() {
    unordered_map<int ,int> hash;
    hash[2]=3;
    if(hash.count(2)){
        cout<<hash[2];
    }
    return 0;   
}



设 F[i,j]表示从 s1[i] 开始,至少需要多少个字符,才能生成 conn(s2,2j)。
F[i,j]=F[i,j−1]+F[(i+F[i,j−1])mod∣s 1∣,j−1]
做倍增优化DP,首先是预处理出若干与2的整数次幂相关的代表状态,再拼凑出答案。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
string s1,s2;
int n1,n2;
ll f[110][32];
int main()
{
    //freopen("in.txt","r",stdin);
    while(cin>>s2>>n2>>s1>>n1)
    {
        bool flag=false;
        memset(f,0,sizeof(f));
        for(int i=0;i<s1.size();i++)
        {
            int pos=i;f[i][0]=0;
            for(int j=0;j<s2.size();j++)
            {
                int cnt=0;
                while(s1[pos]!=s2[j])
                {
                    pos=(pos+1)%s1.size();
                    if(++cnt>=s1.size())
                    {
                        cout<<0<<endl;
                        flag=true;
                    }
                    if(flag)break;
                }
                if(flag)break;
                pos=(pos+1)%s1.size();
                f[i][0]+=cnt+1;
            }
            if(flag)break;
        }
        if(flag)continue;
        for(int j=1;j<=30;j++)
            for(int i=0;i<s1.size();i++)
                f[i][j]=f[i][j-1]+f[(i+f[i][j-1])%s1.size()][j-1];
        ll m=0;
        for(int i=0;i<s1.size();i++)
        {
            ll x=i,ans=0;
            for(int k=30;k>=0;k--)
                if(x+f[x%s1.size()][k]<=s1.size()*n1)
                {
                    ans+=1<<k;
                    x+=f[x%s1.size()][k];
                }
            m=max(m,ans);
        }
        cout<<m/n2<<endl;
    }
    return 0;
}



问题描述
  模拟程序型计算器,依次输入指令,可能包含的指令有

1. 数字:’NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
  2. 运算指令:’ADD’,’SUB’,’MUL’,’DIV’,’MOD’,分别表示加减乘,除法取商,除法取余
  3. 进制转换指令:’CHANGE K’,将当前进制转换为K进制(2≤K≤36)
  4. 输出指令:’EQUAL’,以当前进制输出结果
  5. 重置指令:’CLEAR’,清除当前数字

指令按照以下规则给出:
  数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
  运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
  重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令
  进制转换指令可能出现在任何地方

运算过程中中间变量均为非负整数,且小于2^63。
  以大写的’A’~’Z’表示10~35
输入格式
  第1行:1个n,表示指令数量
  第2..n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出格式
  依次给出每一次’EQUAL’得到的结果
样例输入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
样例输出
2040

我遇到了问题。测试样例都对,就是不通过

错误的代码:
```

include[HTML_REMOVED]

using namespace std;
char hh[36]={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’G’,’K’,’L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,’X’,’Y’,’Z’
};
long long tran(int x,int y){//其他进制转十进制
int s=0;
int t,mi=1;
while(x){
t=x%10;
s+=tmi;
mi
=y;
x=(x-x%10)/10;
}
return s;
}
long long str(string num,int y){//字符串转十进制
int d=0;
int e=num.size();
for(int i=0;i[HTML_REMOVED]‘9’)
{
d=dy+(num[i]-‘0’)-7;}
else{
d=d
y+(num[i]-‘0’);
}
}

return d;

}
string tr(int n,int s)//十进制数转换成s进制数

{

  char o[50];
  char z[50];
  int an=0,i=0,a[32];
    int r=0;
  while(n!=0)

  {
        o[r++] =hh[n%s];     
         n=n/s;        
    }
  int f=0;
   while(r>0){
  z[f]=o[--r];
  f++;

}
z[f]=’ ‘;
return z;
}

int main(){

int n;//指令数 
cin>>n;
vector<string> vector;//存放指令 
string *k=new string [n];//存放操作数字符串 
for(int i=0;i<n;i++){
    string s;
    string m="0";//默认操作数字符串 
    cin>>s;
    vector.push_back(s);
    if(s.substr(0,3)!="EQU"&&s.substr(0,3)!="CLE"&&s.substr(0,3)!="ADD"&&s.substr(0,3)!="SUB"&&s.substr(0,3)!="MUL"&&s.substr(0,3)!="DIV"&&s.substr(0,3)!="MOD")cin>>m;
    k[i]=m;
}
long long ans;//结果 
int u=10;//进制,默认十进制 
for(int i=0;i<n;i++){
    string path=vector[i].substr(0,3);
    if(path=="NUM"){
        if(ans==-1){        
            ans=str(k[i],u);
        }
    }
    if(path=="CLE"){
        ans=-1;}
    if(path=="CHA"){
        u=str(k[i],10);  
    }
    if(path=="EQU"){
    cout<<tr(tran(ans,10),u).substr(0,tr(tran(ans,10),u).size()-1)<<endl;;
  }
    if(path=="ADD"){
    ans+=str(k[i+1],u);

    }
  if(path=="SUB")ans-=str(k[i+1],u);
    if(path=="MUL")ans*=str(k[i+1],u);
  if(path=="DIV")ans/=str(k[i+1],u);
    if(path=="MOD")ans%=str(k[i+1],u);

}
}