猛攻大模拟

发布于:2025-03-31 ⋅ 阅读:(20) ⋅ 点赞:(0)

计算资源调度器

20分

#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int N = 2010;
int n, m,g;
int space[1010];
void work()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> space[i];//记录计算节点所在的可用区
	}
	cin >> g;
	int cnt = 1;
	int j = 0;
	for(int i=1;i<=g;i++)
	{
		int f, a, na, pa, paa, paar;
		cin >> f >> a >> na >> pa >> paa >> paar;
		for (j = 1; j <= f; j++)
		{
			cout << cnt<<" ";
			cnt++;
			if (cnt == n + 1)cnt = 1;
		}
		cout << endl;
	}
	

}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	work();
	return 0;
}

50分

#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int N = 2010;
int n, m,g;
int space[1010];
int number[1010];//节点目前存储的任务数量
map<int, vector<int>> s;
void find(int f)//在无要求的情况下选择任务数量最少的节点
{
	int t = -1;
	
	while (f--)
	{
		int min_num = 0x3f3f3f3f;
		t = -1;
		for (int i = 1; i <= n; i++)
		{
			if (t == -1 || number[i] < min_num)
			{
				t = i;
				min_num = number[t];
			}
		}
		number[t]++;//任务数量加一
		cout << t << " ";
	}
	cout << endl;
	//return t;//返回选择的计算节点
}
void work()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> space[i];//记录计算节点所在的可用区 要在编号为na的可用区的计算节点上
		s[space[i]].emplace_back(i);//往可用区塞入计算节点。必定满足编号从小到大,但任务数量不一定
	}
	cin >> g;
	for (int i = 1; i <= g; i++)
	{
		int f, a, na, pa, paa, paar;
		cin >> f >> a >> na >> pa >> paa >> paar;
		if (na == 0)
		{
			find(f);
		}
		else
		{
			auto it = s.find(na);
			if (it == s.end())
			{
				while (f--)cout << 0 << " ";
				cout << endl;
			}
			else
			{
				auto& v = s[na];
				while (f--)
				{
					int min_num = 0x3f3f3f3f;
					int t = -1;
					for (int j = 0; j < v.size(); j++)
					{
						if (t == -1 || number[v[j]] < min_num)
						{
							t = j;
							min_num = number[v[t]];
						}
					}
					number[v[t]]++;
					cout << v[t] << " ";
				}
				cout << endl;
			}
		}
	}

}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	work();
	return 0;
}

80分! 我觉得考试做到这个程度差不多了

#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int N = 2010;
int n, m,g;
int space[1010];
int number[1010];//节点目前存储的任务数量
vector<int> node[1010];//对每个节点存储的编号
map<int, vector<int>> s;
bool check(int x, int paa)
{
	for (int i = 0; i < node[x].size(); i++)
	{
		if (node[x][i] == paa)return false;
	}
	return true;
}
void find(int f,int a)//在无要求的情况下选择任务数量最少的节点
{
	int t = -1;
	while (f--)
	{
		int min_num = 0x3f3f3f3f;
		t = -1;
		for (int i = 1; i <= n; i++)
		{
			if (t == -1 || number[i] < min_num)
			{
				t = i;
				min_num = number[t];
			}
		}
		number[t]++;//任务数量加一
		node[t].emplace_back(a);
		cout << t << " ";
	}
	cout << endl;
	//return t;//返回选择的计算节点
}
void find(int f,int paa,int a,int paar)//在无要求的情况下选择任务数量最少的节点 且非亲和
{
	if (paar == 1)
	{
		int t = -1;
		while (f--)
		{
			int min_num = 0x3f3f3f3f;
			t = -1;
			for (int i = 1; i <= n; i++)
			{
				if (t == -1 || (number[i] < min_num))
				{
					if (check(i, paa))
					{
						t = i;
						min_num = number[t];
					}
				}
			}
			if (t == -1)
			{
				cout << 0 << " ";
			}
			else
			{
				number[t]++;//任务数量加一
				node[t].emplace_back(a);
				cout << t << " ";
			}
		}
		cout << endl;
		//return t;//返回选择的计算节点
	}
	else
	{
		int t = -1;
		while (f--)
		{
			int min_num = 0x3f3f3f3f;
			t = -1;
			for (int i = 1; i <= n; i++)
			{
				if (t == -1 || (number[i] < min_num))
				{
					if (check(i, paa))
					{
						t = i;
						min_num = number[t];
					}
				}
			}
			if (t == -1)
			{
				min_num = 0x3f3f3f3f;
				t = -1;
				for (int i = 1; i <= n; i++)
				{
					if (t == -1 || number[i] < min_num)
					{
						t = i;
						min_num = number[t];
					}
				}
				number[t]++;//任务数量加一
				node[t].emplace_back(a);
				cout << t << " ";
			}
			else
			{
				number[t]++;//任务数量加一
				node[t].emplace_back(a);
				cout << t << " ";
			}
		}
		cout << endl;
		//return t;//返回选择的计算节点
	}
}
void work()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> space[i];//记录计算节点所在的可用区 要在编号为na的可用区的计算节点上
		s[space[i]].emplace_back(i);//往可用区塞入计算节点。必定满足编号从小到大,但任务数量不一定
	}
	cin >> g;
	for (int i = 1; i <= g; i++)
	{
		int f, a, na, pa, paa, paar;
		cin >> f >> a >> na >> pa >> paa >> paar;
		if (na == 0)
		{
			if (paa == 0) find(f,a);
			else find(f, paa,a,paar);
		}
		else
		{
			auto it = s.find(na);
			if (it == s.end())
			{
				while (f--)cout << 0 << " ";
				cout << endl;
			}
			else
			{
				if (paa == 0)
				{
				auto& v = s[na];
				while (f--)
				{
					int min_num = 0x3f3f3f3f;
					int t = -1;
					for (int j = 0; j < v.size(); j++)
					{
						if (t == -1 || number[v[j]] < min_num)
						{
							t = j;
							min_num = number[v[t]];
						}
					}
					number[v[t]]++;
					node[v[t]].emplace_back(a);
					cout << v[t] << " ";
				}
					cout << endl;
				}
				else
				{
						auto& v = s[na];
						while (f--)
						{
							int min_num = 0x3f3f3f3f;
							int t = -1;
							for (int j = 0; j < v.size(); j++)
							{
								if (t == -1 || (number[v[j]] < min_num))
								{
									if (check(v[j], paa))
									{
										t = j;
										min_num = number[v[t]];
									}
								}
							}
							if (t == -1)
							{
								if(paar==1)cout << 0 << " ";
								else
								{
									min_num = 0x3f3f3f3f;
									t = -1;
									for (int j = 0; j < v.size(); j++)
									{
										if (t == -1 || number[v[j]] < min_num)
										{
											t = j;
											min_num = number[v[t]];
										}
									}
									number[v[t]]++;
									node[v[t]].emplace_back(a);
									cout << v[t] << " ";
								}
							}
							else
							{
								number[v[t]]++;
								node[v[t]].emplace_back(a);
								cout << v[t] << " ";
							}
						}
						cout << endl;
					
				}
			}
		}
	}

}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	work();
	return 0;
}

燃尽了 写不动了 其实这题确实回过头来看不难。但一开始的时候一定要有一个整体框架。下面附上题解 在acwing看了别人的做法 确实想法更好,用set存也更正确,因为可以去重

#include<iostream>
#include<set>
#include<vector>
using namespace std;
const int INF = 1e9;
int n, m;
int cnt[10010], l[10010];
set<int> ss[10010];//可用区i里的节点 
set<int> s[10010];//节点i里的任务 
int find(int na, int paa, int pa)//可用区、反亲和性、亲和性 
{
    int Min = INF;
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        if (cnt[i] < Min && (l[i] == na || na == 0) && (s[i].find(paa) == s[i].end() || paa == 0))//判断可用区和反亲和
        {
            //判断亲和
            int p = l[i];
            int ok = 0;
            for (auto t : ss[p])
                if (s[t].find(pa) != s[t].end())ok = 1;
            if (ok || pa == 0)
            {
                Min = cnt[i];
                ans = i;
            }
        }
    }
    cnt[ans] ++;
    return ans;
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> l[i], ss[l[i]].insert(i);
    int g;
    cin >> g;
    for (int i = 1; i <= g; i++)
    {
        int f, a, na, pa, paa, paar;
        cin >> f >> a >> na >> pa >> paa >> paar;
        vector<int> ans;
        while (f--)
        {
            int x = find(na, paa, pa);
            if (x == 0 && paar == 0)//如果没有,看一下是不是必须满足,直接把反亲和传0就可以
                x = find(na, 0, pa);
            s[x].insert(a);
            ans.push_back(x);
        }
        for (int j = 0; j < ans.size(); j++) cout << ans[j] << " ";
        cout << endl;
    }
    return 0;
}

 附上一张骗分之旅

 登机牌条码

40分做法 注意转换状态

#include<iostream>
#include<vector>
#include<set>
#include<string>
using namespace std;
int w, s;
string str;
int num[1860], cnt=1;//从1开始记录
int dat[1000],idx;
int state;
bool upp(char c)
{
	if ('A' <= c && c <= 'Z')return true;
	return false;
}
bool lowe(char c)
{
	if ('a' <= c && c <= 'z')return true;
	return false;
}
void work()
{
	cin >> w >> s;
	cin >> str;
	state = 0;//默认是大写模式
	for (int i = 0; i < str.size(); i++)
	{
		if (isdigit(str[i]))
		{
			if (state == 2)
			{
				num[cnt++] = stoi(str.substr(i, 1));//转换为数字
			}
			else
			{
				num[cnt++] = 28;//大小写都通过28转换为数字模式
				num[cnt++] = stoi(str.substr(i, 1));
				state = 2;
			}
		}
		else if (upp(str[i]))
		{
			if (state == 2)
			{
				num[cnt++] = 28;
				num[cnt++] = str[i] - 'A';
				state = 0;
			}
			else if (state == 1)
			{
				num[cnt++] = 28;
				num[cnt++] = 28;
				num[cnt++] = str[i] - 'A';
				state = 0;
			}
			else
			{
				num[cnt++] = str[i] - 'A';
			}
		}
		else
		{
			if (state == 0 || state == 2)
			{
				num[cnt++] = 27;
				num[cnt++] = str[i] - 'a';
				state = 1;
			}
			else
			{
				num[cnt++] = str[i] - 'a';
			}
		}
	}
	if (cnt % 2 == 0)//如果是奇数
	{
		num[cnt++] = 29;
	}
	for (int i = 1; i < cnt; i=i+2)
	{
		dat[++idx] = num[i] * 30 + num[i + 1];
	}
	if (s == -1)
	{
		int t = idx;
		while((t + 1) % w != 0)
		{
			t++;
		}
		for (int i = idx + 1; i <= t; i++)
		{
			dat[i] = 900;
		}
		idx = t;
		dat[0] = idx + 1;
		for (int i = 0; i <= idx; i++)cout << dat[i] << endl;
		//cout << num[cnt - 2];
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	work();
	return 0;
}

5555~太菜了 再当一次cv狗。感觉这道题加深了我对于多项式的了解,以及如何造出来多项式,可以多看看 来自acwing题解

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 1e5;

int st = 0;// st 用来表示此时的模式,初始模式为大写模式
//我们用0来代表大写模式 1代表小写模式 2代表数字模式
int check;//校验码的个数
// q 根据 s 映射到 校验码的个数
int q[] = {0,2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};

vector<int> ma,mazi;
int mod = 929;
int g[N],d[N];
vector<int> g1,kd;
void trans_state(int new_st)//状态转换函数
{
    if(st == new_st)return;//如果要转换的状态和原来一样,则不需要转换

    if(new_st == 0)
    {
        //切入大写模式28切入
        ma.push_back(28);
        if(st == 1)ma.push_back(28);// 如果原来的模式为小写模式,需要再用28切入
    }
    else if(new_st == 1)
    {
        //切入小写模式 需要用27切入
        ma.push_back(27);
    }
    else if(new_st == 2)
    {
        //切入数字模式 需要用28切入
        ma.push_back(28);
    }
    //更新模式 这一点千万别忘了
    st = new_st;
}
void get_g() //得到多项式g  长度为 check+1项
{
    g[0] = 1;
    int r = -3;//常数
    for(int i = 1; i <= check;r = (3*r)%mod, i ++)
    {
        for(int j = i; j >= 1; j --)
        {
            g[j] = (g[j]*r + g[j-1]) % mod;// 核心代码 建议自己模拟
        }
        g[0] = g[0] * r % mod;
    }// 每个元素的下标就是x的次数 举个例子
    // 对于 x^3 + x^2 - 1
    //下标 0    1   2   3
   //g    -1   0    2   3
   // 可以看成是倒着存放的
    for(int i = 0; i <= check; i ++)// g1 : vector<int>  用来存放多项式g
    {
        g1.push_back(g[i]);
    }
}
void get_kd()//得到多项式x^k * d(x)  长度为 k + mazi.size()
{
    for(int i = mazi.size()-1, j = 0; i >= 0; i --,j ++)// 这里存放的方式和g多项式一样
    {
        d[j+check] = mazi[i];
    }
    for(int i = 0; i < check + mazi.size(); i ++)// kd : vector<int>
    {
        kd.push_back(d[i]);
    }
    //cout << endl;
}

int main()
{
    int w, s;
    cin >> w >> s;
    string a;
    cin >> a;
    //先得到全部的码字
    for(int i = 0; i < a.size(); i ++)
    {
        if(a[i] >= 'A' && a[i] <= 'Z')
        {
            trans_state(0);
            ma.push_back(a[i]-'A');
        }
        else if(a[i] >= 'a' && a[i] <= 'z')
        {
            trans_state(1);
            ma.push_back(a[i]-'a');
        }
        else
        {
            trans_state(2);
            ma.push_back(a[i]-'0');
        }
    }
    //如果 只有奇数个数字,需要在末尾补充 29
    if(ma.size() % 2 == 1)ma.push_back(29);
    //将它们两两成组:30×H+L  得到码字
    for(int i = 0; i < ma.size(); i += 2)
    {
        mazi.push_back(30 * ma[i] + ma[i+1]);
    }

    //计算 全部数据码字
    check = q[s+1];
    int all = 1 + mazi.size() + check;//长度码字  有效数据码字 校验码字
    // 先计算填充码字
    int pad;//填充码字的的个数
    if(all % w == 0)pad = 0;
    else pad = w - all % w;
    //900 是被当做填充码字的
    for(int i = 0; i < pad; i ++)mazi.push_back(900);

    int n = 1 + mazi.size();// n 表示数据码字的个数
    mazi.insert(mazi.begin(),n);// 将 n 插入到mazi 中
    for(int i = 0; i < mazi.size(); i ++)
    {
        cout << mazi[i] << endl;
    }//写到这里我们就能得到40分了
    if(s != -1)
    {
        //接下来 计算校验码
        get_kd();//  得到 x^k * d(x) 核心函数
        get_g();// 得到多项式g 核心函数

        //  kd / g1  求余
        for(int i = kd.size()-1; i >= 0; i --)// 这个求余的过程也是核心代码
        {
            int t = kd[i] / g1.back();
            int deta = i - g1.size() + 1;
            for(int j = g1.size()-1; j >= 0 && deta >= 0; j --)
            {
                kd[j + deta] -= (t * g1[j])%mod;// 需要注意取模
            }
        }
        //到这里 kd 中的各项 就是我们所求的 余数
        //cout << "r  ";
        for(int i = check-1; i >= 0; i --) {
            cout << (-kd[i] % mod + mod) % mod << endl;// 题目中 多项式 r(x) 中 x 的 i 次项系数对 929 取模后(取正值)的数字即为校验码字 ci。
            //       此处需要加上负号 原因如下
            // 这里简写一下原来的式子 kd = q * g - r
            // 我们求出来的余数是t    kd = q * g + t
            //                 则   r = -t
        }
    }
    return 0;
}


脉冲神经网路 考到这种题就走大运啦,直接错错错! 但这题还是很值得学习的。首先用了滚动数组的想法,因为只能用二维数组来表示不同时间的t值,所以可以模上最大的延误时间+1

但是很奇怪 照着y总代码抄了一遍但也是错的,但无伤大雅,现在就拿大模拟当练阅读能力和码力了。代码如下,依旧找了个题解cv

//
// Created by 刘宇韬 on 2022/2/25.
//
#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
//1000个脉冲源+1000个神经源
const int N = 2005,INF = 0x3f3f3f3f;

//表示一共有 N 个神经元,S 个突触和 P 个脉冲源,输出时间刻 T
int n,s,p,T;
//一个正实数 Δt,表示时间间隔
double dt;
int h[N],e[N],D[N],ne[N],idx;
double w[N],v[N],u[N],a[N],b[N],c[N],d[N];
int r[N];
//存整个过程中神经元发脉冲的次数
int cnt[N];
//存某时刻某个神经元的内部参数
double I[1024][N/2];

static unsigned long _next = 1;

/* RAND_MAX assumed to be 32767 */
//这里要吧所给函数的next换一个变量名
int myrand(void) {
  _next = _next * 1103515245 + 12345;
  return((unsigned)(_next /65536) % 32768);
}

void add(int aa,int bb,double cc,int dd){
  e[idx] = bb;
  w[idx] = cc;
  D[idx] = dd;
  ne[idx] = h[aa];
  h[aa] = idx++;
}

int main(){
  scanf("%d%d%d%d", &n, &s, &p, &T);
  scanf("%lf", &dt);
  memset(h,-1,sizeof h);
  //保证所有的 RN 加起来等于 N
  for(int i = 0; i <n;) {
    //每行有以空格分隔的一个正整数 RN 和六个实数 v u a b c d
    //rn表示下面要输入rn个神经元
    int rn;
    scanf("%d", &rn);
    double vv,uu,aa,bb,cc,dd;
    scanf("%lf%lf%lf%lf%lf%lf", &vv, &uu, &aa, &bb, &cc, &dd);
    //按顺序每一行对应 RN 个具有相同初始状态和常量的神经元
    for(int j = 0; j <rn; j++,i++) {
      v[i] = vv,u[i] = uu,a[i] = aa,b[i] = bb,c[i] = cc,d[i] = dd;
    }
  }
  //输入接下来的 P 行,每行是一个正整数 r,按顺序每一行对应一个脉冲源的 r 参数
  for(int i = n; i <=n+p-1; i++) {
    cin>>r[i];
  }
  //循环数组的长度
  int mod = 0;
  //建图
  for(int i = 0; i <s; i++) {
    //其中 s 和 t 分别是入结点和出结点的编号;w 和 D 分别表示脉冲强度和传播延迟
    int ss,tt,dd;
    double ww;
    cin>>ss>>tt>>ww>>dd;
    add(ss,tt,ww,dd);
    mod = max(mod,dd+1);
  }
  for(int i = 0; i <T; i++) {
    //求出在循环数组中映射的坐标
    int t = i%mod;
    //遍历所有脉冲源
    for(int j = n; j <=n+p-1; j++) {
      //脉冲源在每个时刻以一定的概率发放一个脉冲
      if (r[j]>myrand()){
        //计算状态
        for(int k = h[j]; ~k ; k = ne[k]) {
          int x = e[k];
          //更新每个点的Ik,当前这个点会像下一个点隔D[k]时间后发送脉冲
          I[(t+D[k])%mod][x] +=w[k];
        }
      }
    }

    //枚举所有神经元
    for(int j = 0; j <n; j++) {
      double vv = v[j],uu = u[j];
      //根据公式,跟新状态
       v[j] = vv+dt*(0.04*vv*vv+5*vv+140-uu)+I[t][j];
       u[j] = uu+dt*a[j] *(b[j] *vv-uu);
      //如果满足 vk≥30,神经元会发放一个脉冲
       if (v[j]>=30){
         for(int k = h[j]; ~k ; k = ne[k]) {
           int x = e[k];
           //更新每个点的Ik,当前这个点会像下一个点隔D[k]时间后发送脉冲
           I[(t+D[k])%mod][x] +=w[k];
         }
         //统计该点发脉冲的次数
         cnt[j]++;
         //同时,vk 设为 c 并且 uk 设为 uk+d,其中 c 和 d 也是常量。
         v[j] = c[j],u[j]+=d[j];

       }
    }
    //因为是循环数组,所以用完一次一定要记得清空
    memset(I[t],0,sizeof I[t]);
  }
  double maxv = -INF,minv = INF;
  int maxc = -INF,minc = INF;
  for(int i = 0; i <n; i++) {
    minv = min(minv,v[i]);
    maxv = max(maxv,v[i]);
    minc = min(minc,cnt[i]);
    maxc = max(maxc,cnt[i]);
  }
  printf("%.3lf %.3lf\n", minv, maxv);
  cout<<minc<<' '<<maxc<<endl;


}

命令行选项 写不动了 虽然这题很简单,但是我根本不知道选项能有那么多骚操作参数。附上自己的0分但样例通过代码

#include<iostream>
#include<map>
#include<sstream>
using namespace std;
map<char, int> mapp;
//map<char, int> mq;
bool judge(string str)
{
	bool flag = true;
	for (int i = 0; i < str.size(); i++)
	{
		if (str[i] <= '9' && str[i] >= '0')continue;
		flag = false;
	}
	return flag;
}
void work()
{
	string str;
	cin >> str;
	for (int i = 0; i < str.size(); i++)
	{
		if (str[i + 1] == ':')
		{
			mapp[str[i]] = 1;
			i++;
		}
		else mapp[str[i]] = 0;
	}
	int n;
	cin >> n;
	cin.ignore();
	for (int i = 1; i <= n; i++)
	{
		map<char, int>mq;
		string st;
		getline(cin, st);
		stringstream in(st);
		string tem;
		in >> tem;//第一个不做处理
		bool flag = false;
		//cout << "Case" << " " << i << ":" << " ";
		char now;
		while (in >> tem)
		{
			if (tem[0] == '-' && tem[1] <= 'z' && tem[1] >= 'a')
			{
				if (mapp.find(tem[1]) == mapp.end())
				{
					break;
				}
				if (mapp[tem[1]] == 1)
				{
					flag = true;//接受参数模式
					mq[tem[1]] = 0;
					now = tem[1];
				}
				else
				{
					//cout << "-" << tem[1] << " ";
					mq[tem[1]] = 0;
				}

			}
			else
			{
				if (flag == 1 && judge(tem))
				{
					//cout << stoi(tem) << " ";
					mq[now] = stoi(tem);
					flag = false;
				}
				else
				{
					if (flag == true)mq.erase(now);
					break;
				}
			}
		}
		//cout << endl;
		//cout << "Case" << " " << i << ":" << " ";

		
			cout << "Case" << " " << i << ":" << " ";
			for (auto v : mq)
			{
				if (mapp[v.first] == 1)cout << "-" << v.first << " " << v.second << " ";
				else
				{
					cout << "-" << v.first << " ";
				}
			}
			cout << endl;
	}
}
int main()
{
	work();
	return 0;
}

以下是acwing题解代码,明天再努力吧 今天下线了哎

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
unordered_map<char,int> mp;
void work()
{
    for(int i=0;i<(int)s.size();i++)
    {
        if(s[i]==' ') break;
        if(s[i]!=':' && s[i+1]==':') mp[s[i]]=2;    //有参字符,标记为2
        else
            if(s[i]!=':') 
                mp[s[i]]=1; //无参字符,标记为1
    }
}
int main()
{
    cin>>s;
    s=s+' ';
    work();
    cin>>n;
    getchar();
    for(int i=1;i<=n;i++)
    {
        map<char,string> mq;    //用map存储每行命令的合法项
        getline(cin,s);
        stringstream ssin(s);   //用字符流处理s
        vector<string> str;     
        while(ssin>>s) str.push_back(s);    //将每个字符串加入到str中
        for(int j=1;j<str.size();j++)   //str[0]为"ls",省略,直接从1开始
        {
            if(str[j][0]!='-' || str[j][1]<'a' || str[j].size()!=2) break;  //对含有'-'的字符串进行判断(无参、有参字符的开头)
            char c=str[j][1];
            if(mp[c]==1) mq[c]=c;
            else if(mp[c]==2 && (j+1)<str.size()) mq[c]=str[j+1],j++;   //将有参字符的值赋值为它的下一个元素,j++直接跳过参数
            else break;     //条件不合法,直接跳出循环
        }
        cout<<"Case "<<i<<":";
        for(auto x:mq)
            if(mp[x.first]==1) cout<<" -"<<x.second;    //输出无参
            else cout<<" -"<<x.first<<" "<<x.second;    //输出有参
        cout<<endl;
    }
    return 0;
}

六百六十六 我改出来了 但很丑的代码

#include<iostream>
#include<map>
#include<sstream>
using namespace std;
map<char, int> mapp;
//map<char, int> mq;
bool judge(string str)
{
	bool flag = true;
	for (int i = 0; i < str.size(); i++)
	{
		if ((str[i] <= '9' && str[i] >= '0') || str[i] == '-'||(str[i]<='z'&&str[i]>='a'))continue;
		flag = false;
	}
	return flag;
}
void work()
{
	string str;
	cin >> str;
	for (int i = 0; i < str.size(); i++)
	{
		if (str[i + 1] == ':')
		{
			mapp[str[i]] = 1;
			i++;
		}
		else mapp[str[i]] = 0;
	}
	int n;
	cin >> n;
	cin.ignore();
	for (int i = 1; i <= n; i++)
	{
		map<char, string>mq;
		string st;
		getline(cin, st);
		stringstream in(st);
		string tem;
		in >> tem;//第一个不做处理
		bool flag = false;
		//cout << "Case" << " " << i << ":" << " ";
		char now;
		while (in >> tem)
		{

			if (tem[0] == '-'&&flag==false)
			{
				if (flag == false && tem.size() > 2)break;
				if (mapp.find(tem[1]) == mapp.end())
				{
					break;
				}
				if (mapp[tem[1]] == 1)
				{
					flag = true;//接受参数模式
					if(mq.find(tem[1])==mq.end())
					mq[tem[1]] = "A";
					now = tem[1];
				}
				else
				{
					//cout << "-" << tem[1] << " ";
					mq[tem[1]] = tem[1];
				}

			}
			else
			{
				if (flag == 1 && judge(tem))
				{
					//cout << stoi(tem) << " ";
					mq[now] =tem;
					flag = false;
				}
				else
				{
					if (flag == true)
					{
						mq.erase(now), flag = false;
					}
					break;
				}
			}
		}
		if (flag == true&&mq[now]=="A")mq.erase(now);
		//cout << endl;
		//cout << "Case" << " " << i << ":" << " ";

		
			cout << "Case" << " " << i << ":" << " ";
			for (auto v : mq)
			{
				if (mapp[v.first] == 1)cout << "-" << v.first << " " << v.second << " ";
				else
				{
					cout << "-" << v.first << " ";
				}
			}
			cout << endl;
	}
}
int main()
{
	work();
	return 0;
}