模拟题的第一步就是读懂题 一定要读懂题 读题花30分钟也没有关系
题如果读懂的话 那么实现花不了多少时间 把各个变量写到一张纸上 (很重要)
防止每次往上翻 之后一定要先理解思路 再敲代码
#include <iostream>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N=1e6+10;
int n,m;
struct abc{
int id;//节点号
int num;//节点个数
pii block;//应用分区号 和 当前分区任务数
}a[N];
int g;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
int hao;cin>>hao;
a[i].id=i;a[i].num=0;
a[i].block.x=hao;//存储分区号
a[i].block.y=0;
}
cin>>g;
int mintask=0;// 最小任务数 针对无任何限制的情况
while(g--){
// cout<<"mintask:"<<mintask<<endl;
int f,ai,nai,pai,paai,paar;
cin>>f>>ai>>nai>>pai>>paai>>paar;
if(paai==0&&nai==0&&pai==0){
int cnt=0;
while(1){ //while 跟break搭配 很常用
for(int i=1;i<=n;i++){
if(a[i].num==mintask){
cnt++;
a[i].num++;
a[i].block.y++;//对应 应用区节点数++
cout<<a[i].id<<' ';
}
if(cnt==f) break;
}
if(cnt==f) break;
mintask++;//若第一轮没退出 mintask再加 必须放在下面 break在上面
}
}
else{
int id=0;
int cnt=0;
int flag=0;
for(int i=1;i<=n;i++){
if(nai==a[i].block.x){
flag=1;//判读是否有这个分区
id=i;
break;
}
}
if(!flag){
while(f--){//直接输出0
cout<<0<<' ';
}
}
else{
int mintask1=a[id].block.y;//求当前分区最小任务数 针对只有分区限制的情况
for(int i=1;i<=n;i++){
if(nai==a[i].block.x){
// cout<<"i:"<<i<<"blocky:"<<a[i].block.y<<" ";
mintask1=min(mintask1,a[i].block.y);
}
}
// cout<<endl;
// cout<<"zuixiao"<<mintask1<<endl;
while(1){
for(int i=1;i<=n;i++){//答题流程一样 但只针对分区
if(a[i].block.x==nai){
if(a[i].num==mintask1){
cnt++;
a[i].num++;
cout<<a[i].id<<' ';
}
}
if(cnt==f) break;
}
if(cnt==f) break;
// cout<<"jfioeqhfoiw"<<endl;
mintask1++;
}
}
}
cout<<endl;
}
return 0;
}
2023-5-12 再次看之前的代码 感觉好臭好长 数组能做的用STL来模拟 会简单很多 50分:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <map>
#include <set>
using namespace std;
const int N = 1010;
typedef pair<int, int> PII;
int n, m, k; // 计算节点数,分区数
map<int, set<int>> area_node; // 区_节点
map<int, int> num; // 判断数目
int cknq(int i, int na)
{
if (!na)
return 1;
if (area_node[na].count(i))
return 1;
else
return 0;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
area_node[x].insert(i);
}
cin >> k;
while (k--)
{
int f, a, nq, tq, ntq, must;
cin >> f >> a >> nq >> tq >> ntq >> must;
for (int p = 0; p < f; p++)
{
int flag = 0;
int h=-1,min_h=1e5;//序号 对应的数目
for (int i = 1; i <= n; i++)
{
if (cknq(i, nq))
{
if(num[i]<min_h){
min_h=num[i];
h=i;
}
}
}
if(h!=-1){
cout<<h<<' ';
num[h]++;
}
else cout << 0 << ' ';
}
cout << endl;
}
return 0;
}
100分代码:找到正确的逻辑流程才可 没有逻辑流程就是瞎写
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <unordered_map>
#include <set>
using namespace std;
const int N = 1010;
typedef pair<int, int> pii;
int n, m, k; // 计算节点数,分区数
unordered_map<int, set<int>> area_node; // 区_节点
unordered_map<int, int> node_num; // 判断数目
unordered_map<int, set<int>> app_node; // 应用——节点
int node_area[N]; // 节点_区
int cknq(int i, int nq) // 节点 区
{
if (!nq)
return 1;
if (area_node[nq].count(i))
return 1;
else
return 0;
}
int cktq(int i, int tq) // 节点 应用号 在同一个可用区
{
// 应用号——可用区——包含这一节点
// 应用-节点-区
if (!tq)
return 1;
for (auto x : app_node[tq])
{
if (node_area[x] == node_area[i])//在其中一个可用区即可
return 1;
}
return 0;
}
int ckntq(int i, int ntq) // 节点 应用号 不在同一个节点
{
if(!ntq) return 1;
for(auto x:app_node[ntq]){
if(i==x) return 0;
}
return 1;
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
area_node[x].insert(i);
node_area[i] = x;
}
cin >> k;
while (k--)
{
int f, a, nq, tq, ntq, must;
cin >> f >> a >> nq >> tq >> ntq >> must;
for (int p = 0; p < f; p++)
{
vector<int> res, t;
for (int i = 1; i <= n; i++)
{
if (cknq(i, nq) && cktq(i, tq) && ckntq(i, ntq))
res.push_back(i);
if (!must && cknq(i, nq) && cktq(i, tq))
t.push_back(i);
}
if (!must && !res.size())
res = t;
if (!res.size())
cout << 0 << ' ';
else
{
// 节点_任务数目 编号
vector<pii> r;
for (auto x : res)
r.push_back({node_num[x], x});
sort(r.begin(), r.end());
cout << r[0].second << ' ';
node_num[r[0].second]++;
app_node[a].insert(r[0].second);
}
}
cout << endl;
}
return 0;
}
性进行判断 关键在于找到模拟的流程