CSUST 我爱三国杀
按照条件模拟吧 细心加耐心
#include<bits/stdc++.h>
#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include <cstdio>
#include <iostream>
#include <vector>
#define ll int
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
int vis=0,wa=1,it;
int n;
struct per{
char op; //牌
char num; // 点数
}p[550];
set<ll>sac;
set<ll>swa;
struct student{
int nums; //闪
int jgm;
int fym;
int numa;//杀
int hp;
int flag; //濒死判定标记
}py[3];
void mopai(ll x,ll y){
if(p[x].op=='s'){
py[vis].nums++;
}
if(p[x].op=='a'){
py[vis].numa++;
}
if(p[x].op=='+'){
py[vis].fym++;
}
if(p[x].op=='-'){
py[vis].jgm++;
}
if(p[y].op=='s'){
py[vis].nums++;
}
if(p[y].op=='a'){
py[vis].numa++;
}
if(p[y].op=='+'){
py[vis].fym++;
}
if(p[y].op=='-'){
py[vis].jgm++;
}
}
// 当前进攻方 被进攻方
ll check(ll ac,ll wa){ //正规
int caijue;
if(py[ac].numa>0){
//有杀
if((py[wa].fym==0)||(py[wa].fym>0&&py[ac].jgm>0)){
py[wa].flag++; //濒死标记
}
}
if(py[wa].flag!=0){
//判断死不死
it++;
n--;
if(n==0){
return 2 ; //平局
}
caijue=p[it].num-'0';
if(swa.find(caijue)!=swa.end()){
return 0; // ac 获胜
}
if(swa.find(caijue)==swa.end()){
swa.insert(caijue);
}
}
return 1; //安然
}
ll checkp(ll ac,ll wa){ //正规
int caijue;
if(py[ac].numa>0){
//有杀
if((py[wa].fym==0)||(py[wa].fym>0&&py[ac].jgm>0)){
py[wa].flag++; //濒死标记
}
}
if(py[wa].flag!=0){
//判断死不死
it++;
n--;
if(n==0){
return 2 ; //平局
}
caijue=p[it].num-'0';
if(sac.find(caijue)!=sac.end()){
return 0; // ac 获胜
}
if(sac.find(caijue)==sac.end()){
sac.insert(caijue);
}
}
return 1; //安然
}
void f(){
for(int i=0;i<=1;i++){
py[i].flag=0;
py[i].fym=0;
py[i].jgm=0;
py[i].hp=0;
py[i].numa=0;
}
}
void fft(){
for(int i=0;i<=1;i++){
py[i].flag=0;
//py[i].fym=0;
// py[i].jgm=0;
py[i].hp=0;
py[i].numa=0;
}
}
int main(){
char ca,cc;
int a,b;
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>p[i].op;
}
for(int i=1;i<=n;i++){
cin>>p[i].num;
}
f();
scanf("%d",&a);
scanf("%d",&b);
sac.insert(a);
swa.insert(b);
it=0;
while(n>0){
if(n-1==0||n-2==0){ //牌摸完了
printf("ping\n");
break;
}
mopai(it+1,it+2); //摸牌
it=it+2;
n=n-2;
if(vis==0){
int flagr=check(vis,wa);
if(flagr==0){
printf("win\n");
return 0;
}
if(flagr==2){
printf("ping\n");
return 0;
}
}
if(vis==1){
int flagr=checkp(vis,wa);
if(flagr==0){
printf("lose\n");
return 0;
}
if(flagr==2){
printf("ping\n");
return 0;
}
}
fft();
vis=(vis+1)%2;
wa=(wa+1)%2;
}
return 0;
}
CSUST 座位预定
飞机座位的安排 - - 细心模拟 慢慢搞吧 我也就搞了很久而已
#include<bits/stdc++.h>
#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include <cstdio>
#include <iostream>
#include <vector>
#define ll long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
ll gcd(ll a,ll b){if(a<0)a=-a;if(b<0)b=-b;return b==0?a:gcd(b,a%b);}
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-48;isdigit(ch=getchar());res=(res<<1)+(res<<3)+ch - 48);flag&&(res=-res);}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll qp(ll a,ll b,ll mod){ll ans=1;if(b==0){return ans%mod;}while(b){if(b%2==1){b--;ans=ans*a%mod;}a=a*a%mod;b=b/2;}return ans%mod;}//快速幂%
ll qpn(ll a,ll b, ll p){ll ans = 1;a%=p;while(b){if(b&1){ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元 (分子*qp(分母,mod-2,mod))%mod;
ll r,n;
struct per{
ll f; //舒适度
char op;
}flagt[200][35];
ll Lf=0,Rf=0;
ll checkp(){
ll sr=0; // r+2
ll srr=0; // r/2+3
ll r2=2;
ll r3=r/2+3;
for(int i=1;i<=11;i++){
if(flagt[r2][i].op=='-'){
sr++;
//空座
}
if(flagt[r3][i].op=='-'){
srr++;
}
} //计算安全排空座完毕
//printf("QAQ %lld %lld\n",sr,srr);
if(sr==srr&&srr==0){
return -1; //不合适
}
if(sr>srr){
return r2;
}
if(sr<srr){return r3 ; }
// 以下是相等而且不为0
return r2;
}
ll sum[100];
ll cnt[100];
ll pos[100];
ll cnm;
ll num;
ll checkvi(){
num=0;
cnm=99999;
memset(sum,0,sizeof(sum));
memset(cnt,0,sizeof(cnt));
memset(pos,0,sizeof(pos));
ll maxx=-1;
ll mimm=1000;
ll r1=1;
ll r2=r/2+2;
ll r3=r+3;
for(int i=1;i<=r+3;i++){
if(i==1||i==(r/2+2)||i==r+3){
sum[i]=99999;
continue;
//安全排 不再查询
}
if(i==2||i==(r/2+3)){
sum[i]=99999;
continue;
}
for(int j=1;j<=11;j++){
if(flagt[i][j].op=='-'){
sum[i]++;
}
}
maxx=max(maxx,sum[i]); //空座最大值
}
for(int i=1;i<=r+3;i++){
if(i==1||i==(r/2+2)||i==r+3){
continue;
//安全排 不再查询
}
if(i==2||i==(r/2+3)){
// sum[i]=99999;
continue;
}
if(sum[i]==maxx){
num++;
cnt[num]=i; //标记空座最多的排
pos[num]=i; //真实下标排
}
}
if(num==1){
//空排max唯一
return cnt[1];
}
for(int i=1;i<=num;i++){
ll a,b,c;
a=abs(cnt[i]-r1);
b=abs(cnt[i]-r2);
c=abs(cnt[i]-r3);
cnt[i]=min(a,min(b,c));
mimm=min(mimm,cnt[i]); //最近的安全排
}
for(int i=1;i<=num;i++){
if(mimm==cnt[i]){
cnm=min(pos[i],cnm);
}
//从排小的到排大的 存
}
return cnm;
}
ll checkrow(ll p){
ll F=-1; //飞机炫的人数
for(int i=1;i<=11;i++){
if(flagt[p][i].op=='-'){
//可以选择的空位
F=max(F,flagt[p][i].f); //求出当前可以拿到的 fmax
}
}
//printf("W %lld\n",F);
if(F==5){
if(flagt[p][5].op=='-'&&flagt[p][7].op!='-'){
return 5;
}
if(flagt[p][5].op!='-'&&flagt[p][7].op=='-'){
return 7;
}
if(flagt[p][5].op=='-'&&flagt[p][7].op=='-'){
if(Lf>Rf){
return 7;
}
else{
return 5;
}
}
}
if(F==4){
if(flagt[p][3].op=='-'&&flagt[p][9].op!='-'){
return 3;
}
if(flagt[p][3].op!='-'&&flagt[p][9].op=='-'){
return 9;
}
if(flagt[p][3].op=='-'&&flagt[p][9].op=='-'){
if(Lf>Rf){
return 9;
}
else{
return 3;
}
}
}
if(F==3){
if(flagt[p][1].op=='-'&&flagt[p][11].op!='-'){
return 1;
}
if(flagt[p][1].op!='-'&&flagt[p][11].op=='-'){
return 11;
}
if(flagt[p][1].op=='-'&&flagt[p][11].op=='-'){
if(Lf>Rf){
return 11;
}
else{
return 1;
}
}
}
if(F==2){
return 6;
}
if(F==1){
if(flagt[p][2].op=='-'&&flagt[p][10].op!='-'){
return 2;
}
if(flagt[p][2].op!='-'&&flagt[p][10].op=='-'){
return 10;
}
if(flagt[p][2].op=='-'&&flagt[p][10].op=='-'){
if(Lf>Rf){
return 10;
}
else{
return 2;
}
}
}
}
int main(){
ll t;
read(t);
ll ok=0;
while(t--){
ok++;
read(r);
read(n);
Lf=0;
Rf=0;
for(int i=1;i<=r+3;i++){
for(int j=1;j<=11;j++){
flagt[i][j].f=0;
flagt[i][j].op='\0';
}
}
for(int i=1;i<=r+3;i++){
for(int j=1;j<=11;j++){
cin>>flagt[i][j].op;
if(flagt[i][j].op=='#'){
if(j<=5){
Lf++;
}
if(j>=7){
Rf++;
}
}
if(flagt[i][j].op=='-'){
if(j==5||j==7){
flagt[i][j].f=5;
}
if(j==3||j==9){
flagt[i][j].f=4;
}
if(j==1||j==11){
flagt[i][j].f=3;
}
if(j==6){
flagt[i][j].f=2;
}
if(j==2||j==10){
flagt[i][j].f=1;
}
}
}
}
for(int i=1;i<=n;i++){
//查询普通排
ll ss='a'+i-1;
ll ro;//列
ll p=checkp(); //查询安全排
if(p==-1){
p=checkvi(); //返回普通排的 牌号
// p 作为合法最优排
}
ro=checkrow(p); // BUG
if(ro<=5){
Lf++;
}
if(ro>=7){
Rf++;
}
flagt[p][ro].op=ss;
}
printf("Case #%lld:\n",ok);
for(int i=1;i<=r+3;i++){
for(int j=1;j<=11;j++){
printf("%c",flagt[i][j].op);
}
printf("\n");
}
}
}
Share
啥都不会,我自闭了,我他妈太菜了