小工具知识网

当前位置: 首页 > 行业知识 > 上海大学第21届ACM程序设计联赛(春季赛)部分题解

行业知识

上海大学第21届ACM程序设计联赛(春季赛)部分题解

2026-11-14 05:47:43 来源:互联网转载

文章目录

  • 前言
  • A.Antiamuny wants to learn binary search
  • B.Bespread with chequers
  • G.Golden jade matrix checker
  • H.How to know the function
  • I.I like UNO !
  • J.Juxtaposed brackets
  • 后记

    前言

    ���于某些原因,模拟了一下2023年上海大学ACM校赛练练手,随便写了几个题,整理一下自己的题解。

    ()

    题目地址

    A.Antiamuny wants to learn binary search

    傻呗签到题,略。

    ()
    #includeusing namespace std;#define ll long longint f(int l,int r,int x) { // l cnt++;int mid = (l + r) / 2;if (mid == x) break;if (mid  l >> r >> x;cout     int t;    cin  t;    a[1]=1,a[2]=3;    for(int i=3;i        a[i]=(2*a[i-2]%mod+a[i-1])%mod;    }    while(t--){        int n;        cin > n;        cout int t;scanf("%d",&t);while(t--){int n,m,h,w;scanf("%d%d%d%d",&n,&m,&h,&w);ll sum=0;for(int i=1;ifor(int j=1;jcin  a[i][j];prefix[i][j]=0;sum+=a[i][j];}}for(int i=1;ifor(int j=1;jprefix[i][j]= prefix[i][j-1]+a[i][j];}}for(int j=1;jfor(int i=1;iprefix[i][j]+=prefix[i-1][j];}}if(sumprintf("NO\n");continue;}bool flag=true;for(int i=1;i+h-1for(int j=1;j+w-1//[i,j]~[i+h-1,j+w-1]ll sum=prefix[i+h-1][j+w-1]-prefix[i-1][j+w-1]-prefix[i+h-1][j-1]+prefix[i-1][j-1];if(sum=0){flag=false;break;}}}printf("%s\n",flag?"YES":"NO");}} int t;cin  t;while(t--){ll n;cin  n;if(n==0){cout cout 蓝跳过
  • 当玩家无牌可出需要抽牌时,如果可以打出就必须立刻打出,如果是效果牌必须立刻结算。
#includeusing namespace std;#define ll long longconst ll maxn=3e6;const ll mod=1e9+7;const int total=4;struct Card{int type;//花色 int number;//标识 };int priorType(char c){//花色优先级 (数值越小越优先)if(c=='R'){return 1;}if(c=='Y'){return 2;}if(c=='B'){return 3;}if(c=='G'){return 4;}return 4;}int priorNumber(char c){//数字优先级 if(c>='0' && creturn 1+(c-'0');}if(c=='+'){return 11;}if(c=='R'){return 12;}if(c=='S'){return 13; }return 13; }int player[total+10][10][20];//玩家-花色-优先级 Card deck[maxn+10];//牌堆int handSize[total+10];//手牌数int isWinning(){for(int i=1;iif(handSize[i]==0){return i;}}return -1;}int getNextPlayer(int current,int sgn){//确定出牌下家 int nextPlayer=current;if(sgn==1){//正向nextPlayer++;if(nextPlayertotal){nextPlayer-=total;}}else{nextPlayer--;if(nextPlayernextPlayer+=total;}}return nextPlayer;}int main(){for(int i=1;ifor(int j=1;jchar temp[10];scanf("%s",temp);player[i][priorType(temp[0])][priorNumber(temp[1])]++;}handSize[i]=5;}int n;scanf("%d",&n);for(int i=1;ichar temp[10];scanf("%s",temp);deck[i].type=priorType(temp[0]);deck[i].number=priorNumber(temp[1]);}int current=1;//当前出牌玩家int sgn=1;//下一位玩家的顺序(默认为正) int deckTop=1;//当前牌堆顶 int deckBottom=n;//当前牌堆底 int lastType=deck[n].type;int lastNumber=deck[n].number;while(isWinning()==-1){bool flag=false;//是否出过牌 for(int i=1;i//相同花色数字牌if(player[current][lastType][i]0){player[current][lastType][i]--;lastNumber=i;//更新前一张牌数字 handSize[current]--;flag=true;break;}}for(int i=1;i//相同数字的异色牌if(player[current][i][lastNumber]0){player[current][i][lastNumber]--;lastType=i;//更新前一张牌花色 handSize[current]--;flag=true;break;}}for(int i=lastNumber+1;i//相同花色功能牌if(player[current][lastType][i]0){player[current][lastType][i]--;lastNumber=i;//更新前一张牌数字handSize[current]--; flag=true;break;}}if(flag){//如果打出了一张牌deckBottom++;deck[deckBottom].type=lastType;deck[deckBottom].number=lastNumber;//更新底部if(lastNumber=1 && lastNumber//数字牌正常更新下家 current=getNextPlayer(current,sgn);} else if(lastNumber==11){//+2牌,让下家抽2,并跳过 int nextPlayer=getNextPlayer(current,sgn);//确定出牌下家player[nextPlayer][deck[deckTop].type][deck[deckTop].number]++;player[nextPlayer][deck[deckTop+1].type][deck[deckTop+1].number]++;handSize[nextPlayer]+=2;//手牌数+2deckTop+=2;//抽2张牌current=getNextPlayer(nextPlayer,sgn);//下家被跳过 }else if(lastNumber==12){//反转牌 sgn=-sgn;current=getNextPlayer(current,sgn);//反向顺序 }else if(lastNumber==13){//跳过牌 int nextPlayer=getNextPlayer(current,sgn);current=getNextPlayer(nextPlayer,sgn);//下家被跳过 }}else{//没出牌,摸牌if(lastType==deck[deckTop].type || lastNumber==deck[deckTop].number){//抽到的牌可以立刻被打出 lastType=deck[deckTop].type;lastNumber=deck[deckTop].number;deckBottom++;deck[deckBottom].type=lastType;deck[deckBottom].number=lastNumber;//更新底部deckTop++;if(lastNumber=1 && lastNumber//数字牌正常更新下家 current=getNextPlayer(current,sgn);}else if(lastNumber==11){//+2牌,让下家抽2,并跳过 int nextPlayer=getNextPlayer(current,sgn);//确定出牌下家 player[nextPlayer][deck[deckTop].type][deck[deckTop].number]++;player[nextPlayer][deck[deckTop+1].type][deck[deckTop+1].number]++;handSize[nextPlayer]+=2;//手牌数+2deckTop+=2;//抽2张牌current=getNextPlayer(nextPlayer,sgn);//下家被跳过 }else if(lastNumber==12){//反转牌 sgn=-sgn;current=getNextPlayer(current,sgn);//反向顺序 }else if(lastNumber==13){//跳过牌 int nextPlayer=getNextPlayer(current,sgn);current=getNextPlayer(nextPlayer,sgn);//下家被跳过 }}else{//还是没能打出牌 player[current][deck[deckTop].type][deck[deckTop].number]++;handSize[current]++;//手牌数+1deckTop++;current=getNextPlayer(current,sgn);//正常轮换下家 }}}printf("%c\n",'A'+isWinning()-1);} 

上一篇:怎么建立服务器局域网?

下一篇:逃离暗影服务器怎么进?