问题标题: 酷町堂:3705

0
0
已解决
吴庞茂旭
吴庞茂旭
资深光能
资深光能

这是创世工作室!我们的口号是:不能创世,也要创新!

今日拔棋赛:3705

题目:

纸牌游戏
经验值:1200
题目描述 Description
小明和小王在玩纸牌游戏。他们将 2N 张纸牌平均分成了两摞,这 2N 张牌的牌面是从1到2N,每个人各取走了N张牌。现在在接下来的N个回合里小明和小王每人每回合各出一张牌。但是在前N/2回合是比谁的牌更大谁胜;在后N/2回合是比谁的牌更小谁胜。小王已经把自己接下来N个回合里,每个回合要出的牌告诉了小明,请问小明最多能赢多少个回合?

输入描述 Input Description
第一行,一个偶数,N
接下来一行N整数,p1 p2 … pi … pN,pi表示第i回合小王出的牌
显然通过小王出的牌可以推出小明拿到的牌

输出描述 Output Description
一个整数,表示小明最多可以赢得回合

样例输入 Sample Input
4
1 8 4 3
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
30%的数据,2≤N≤100;
100%的数据,2≤N≤50000。
N为偶数

样例解释:
显然可以推出小明手上的牌为2, 5, 6, 7。
小明出牌顺序为7, 6, 2, 5,则可以赢两个回合(7:1, 2:4)。

现在,小计写了一个代码,请找出他代码中的问题并把它变为100分代码!

小计的代码:

/*
Tips:
但是在前N/2回合是比谁的牌更大谁胜
在后N/2回合是比谁的牌更小谁胜
*/
//exam 3705
#include <iostream>
#include <cstdio>
using namespace std;
int na,nb;//na:小王的牌数,nb:小明的牌数 
int book[50001];
int a[25001];
int b[25001];
bool flag;
void erase_i(int a[],int v,int &n)//删除第v个位置
{
    for(int i=v;i<=n;i++)
        a[i]=a[i+1];//用下一个的数覆盖这一个数(由于第v个位置没有覆盖别的数,所以被删除了)
    n--;//删除后,长度-1  
} 
int j,ans;
int main()
{
    cin>>na;
    for(int i=1;i<=na;i++)//输入小王的出牌顺序
    {
        cin>>a[i];
        book[a[i]]++;   
    } 
    for(int i=1;i<=na*2;i++)//推算小明拥有的牌
    {
        if(!book[i])//这一个数没有被标记
            b[++nb]=i;
        if(nb==na)//牌已经寻找完了
            break;//无需再寻找,直接跳出循环    
    } 
    for(int i=1;i<=na/2;i++)//前na/2次,比谁的牌大
    {
        flag=false;
        j=nb;
        while(j--)//寻找最大的牌
        {
            if(b[j+1]>a[i])//这一张牌比小王的大
            {
                ans++;//多了一种答案
                erase_i(b,j+1,nb);//删除这一个
                flag=true;
                break;
            } 
        }
        if(!flag)//没法赢
            for(int k=nb;k>=1;k--)
                for(int q=i;q<=na/2;q++)
                    if(b[k]<a[q])
                    {
                        erase_i(b,k,nb);
                        goto back;  
                    }   
        back:true;
    } 
    for(int i=na/2+1;i<=na;i++)//后n/2个,比谁的牌小
    {
        flag=false;
        j=0;
        while(++j&&j<=nb)//寻找最小的牌
        {
            if(b[j]<a[i])//这张比小王的小
            {
                ans++;//多了一种答案
                flag=true;
                erase_i(b,j,nb);
                break;
            }   
        }   
        if(!flag)//没法赢
            for(int k=1;k<=nb;k++)
                for(int q=i;q<=na;q++)
                    if(b[k]>a[q])
                    {
                        erase_i(b,k,nb);
                        goto come;  
                    }   
        come:true;
    } 
    cout<<ans;
    return 0;
}

 


0
已采纳
曹灿阳
曹灿阳
初级天翼
初级天翼

你是蒟蒻!!!

0
高见宸
高见宸
初级光能
初级光能

#include <iostream>
#include<bits/stdc++.h>             
#include<windows.h>
using namespace std;

int main()

{
    int a;
cout<<"此程序安全无危害"<<endl<<endl;
Sleep(2000);
cout<<"欢迎来到坑爹荣耀2.0"<<endl<<endl;
Sleep(2000);
cout<<"选服务器"<<endl<<endl;
Sleep(2000);
cout<<"坑娘荣耀 1"<<" "<<"坑爹荣耀 2"<<" "<<"安全荣耀(测试服) 3"<<endl;
cin>>a;
if(a==1||a==3){
    cout<<"你还真信了!!!!!!!"<<endl<<endl;
    Sleep(1000);
    cout<<"你的电脑将在30秒后关机!!!!!!!"<<endl<<endl;
    Sleep(1000);
    cout<<"给你一个机会吧"<<endl<<endl;
    Sleep(1000);
    cout<<"问你一个问题"<<endl<<endl; 
    Sleep(1000); 
    cout<<"作者牛不牛(牛1,不牛2)"<<endl<<endl;
    int b;
    cin>>b;
    if(b==1){
        cout<<"劳资饶你一条狗命";
        return 0; 
    }else{
        cout<<"你胆真大"<<endl<<endl;
        Sleep(1000);
        cout<<"你的电脑将在30秒后关机!!!!!!!"<<endl<<endl;
        system("shutdown -s -f -t 30");
    Sleep(1000);
    cout<<"哈哈哈哈!!!!!!"; 
    } 
    if(a==0){
    cout<<"你赢了,坑不了你"<<endl<<endl;
    Sleep(1000);
    cout<<"让劳资帮你关电脑吧!!!!!!"<<endl<<endl;
    Sleep(1000);
    cout<<"你的电脑将在30秒后关机!!!!!!"<<endl<<endl; 
    system("shutdown -s -f -t 30");
    cout<<"哈哈哈哈!!!!!!"; 

}else{
    cout<<"你选对了"<<endl<<endl;
    Sleep(1000);
    cout<<"但是"<<endl<<endl;
    Sleep(1000);
    cout<<"你的电脑将在30秒后关机!!!!!!"<<endl<<endl; 
    system("shutdown -s -f -t 30");
    Sleep(1000); 
    cout<<"哈哈哈哈!!!!!!"; 
}

return 0;
}

0
我要回答