2023年中国大学生程序设计竞赛女生专场(ccpc女生赛)
L–养成游戏
直接进行穷举
using namespace std;
struct LL
{
int i,j,op,a,b,d,v;
}q[110];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int zz=0;zz<m;zz++)
{
cin>>q[zz].i>>q[zz].j>>q[zz].op>>q[zz].a>>q[zz].b>>q[zz].d>>q[zz].v;
}
int a[9];
long long ans=-1,t;
for(a[1]=0;a[1]<=k;a[1]++)
{
for(a[2]=0;a[2]<=k;a[2]++)
{
for(a[3]=0;a[3]<=k;a[3]++)
{
for(a[4]=0;a[4]<=k;a[4]++)
{
for(a[5]=0;a[5]<=k;a[5]++)
{
for(a[6]=0;a[6]<=k;a[6]++)
{
t=0;
for(int i=0;i<m;i++)
{
if(q[i].v==0) continue;
if(q[i].op==0)
{
if(((q[i].a*a[q[i].i])+(q[i].b*a[q[i].j]))<=q[i].d)
t+=q[i].v;
}
else if(q[i].op==1)
{
if(((q[i].a*a[q[i].i])+(q[i].b*a[q[i].j]))>=q[i].d)
t+=q[i].v;
}
} ans=max(ans,t);
}
}
}
}
}
}
cout<<ans;
return 0;
}
F–最长上升子序列
对样例进行模拟,从最小数开始排,在a[]数组中碰到前后相等的数(也就是上升的长度相等)就从后往前排,当a[]数组中所给的数比他前边的数小,就可以直接判断他为“-1“。
#include "vector"
using namespace std;
const int N = 1e7;
vector<int > v[N];
int a[N], b[N];
int main(){
int n;
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int max = 0, flag = 0;
cin>>n;
for(int i = 1; i <= n; i++){
cin>>a[i];
if(a[i] > max)
{
if(a[i] - max > 1) flag = 1;
max = a[i];
}
v[a[i]].push_back(i);
}
if(flag) cout<<"-1"<<endl;
else
{
int p = 1;
for(int i = 1; i <= max; i++)
for(int j = v[i].size() - 1; j >= 0; j --)
{
int t = v[i][j];
b[t] = p ++;
}
for(int i = 1; i <= n; i++)
cout<<b[i]<<' ';
cout<<endl;
}
}
G–精灵宝可梦对战
使用队列,在进行攻击的时候,先出栈,对战况进行模拟,判断可梦是否还存活,如果存活,在重新进栈,直到某一方可梦数为0;注意攻击顺序会发生改变。
using namespace std;
const int N = 1e5 + 5;
int h1[N], a1[N], b1[N], c1[N], d1[N], e1[N], w1[N], ea[N];
int h2[N], a2[N], b2[N], c2[N], d2[N], e2[N], w2[N], eb[N];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int n, m, k;
std::cin >> n >> m >> k;
std::queue<int> A, B;
for(int i = 1; i <= n; i ++) {
std::cin >> h1[i] >> a1[i] >> b1[i] >> c1[i] >> d1[i] >> e1[i] >> w1[i];
A.push(i);
}
for(int i = 1; i <= m; i ++) {
std::cin >> h2[i] >> a2[i] >> b2[i] >> c2[i] >> d2[i] >> e2[i] >> w2[i];
B.push(i);
}
int cnt = 0;
int nowa, nowb;
while(!A.empty() && !B.empty() && cnt < k) {
nowa = A.front();
nowb = B.front();
A.pop();
B.pop();
int p = std::max(0, a1[nowa] - c2[nowb]);
int ma = std::max(0, b1[nowa] - d2[nowb]);
int ww = 0;
if(ea[nowa] >= e1[nowa])
ww = w1[nowa];
int hurt = std::max({p, ma, ww});
if(p == hurt) {
ea[nowa] ++;
h2[nowb] -= p;
}
else if(ma == hurt) {
ea[nowa] ++;
h2[nowb] -= ma;
}
else {
ea[nowa] -= e1[nowa];
h2[nowb] -= ww;
}
A.push(nowa);
nowa = A.front();
if(h2[nowb] <= 0) {
if(!B.empty()) {
nowb = B.front();
B.pop();
}
else break;
}
p = std::max(0, a2[nowb] - c1[nowa]);
ma = std::max(0, b2[nowb] - d1[nowa]);
ww = 0;
if(eb[nowb] >= e2[nowb])
ww = w2[nowb];
hurt = std::max({p, ma, ww});
if(p == hurt) {
eb[nowb] ++;
h1[nowa] -= p;
}
else if(ma == hurt) {
eb[nowb] ++;
h1[nowa] -= ma;
}
else {
eb[nowb] -= e2[nowb];
h1[nowa] -= ww;
}
B.push(nowb);
if(h1[nowa] <= 0) A.pop();
cnt ++;
}
if(!A.empty() && !B.empty())
std::cout << "Draw" << '\n';
else if(!A.empty())
std::cout << "Alice" << '\n';
else
std::cout << "Bob" << '\n';
return 0;
}