山东大学程序设计竞赛新生挑战赛题解

WHQ的考试成绩

https://ac.nowcoder.com/acm/contest/8844/F

我也写个题解喽

wwww为了被显示在题解区就投 M 题题解了wwww


language : C++

代码中头文件均省略。

图片说明

A. A Greeting from ACM/ICPC Lab

阅读理解题,注意「输出描述」里有四个字符的提示,输出 deer 即可。

B. A very easy problem

直接模拟即可,注意特判 0

Code:

using namespace std;
string str;
int main()
{
    cin>>str; int l=str.length();
    for (int i=0;i<l;i++)
    {
        if ((i!=l-1)&&(str[i+1]=='0')) cout<<char((str[i]-'0')*10+'`'),++i;
        else cout<<char(str[i]-'1'+'a');
    } // putchar 会玄学 WA
    return 0;
}

C. 送信

暴力模拟即可。

Code:

using namespace std;
string str;
int x,y;
int main()
{
    cin>>str; int l=str.length();
    for (int i=0;i<l;i++)
    {
        if (str[i]=='E') ++x;
        else if (str[i]=='S') --y;
        else if (str[i]=='W') --x;
        else ++y;
    } printf("%d %d",x,y);
    return 0;
}

F. WHQ的考试成绩

排个序即可,注意第 大要反向。

Code:

using namespace std;
const int N=1005;
int a[N],n,k;
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=0;i<n;i++) scanf("%d",a+i);
    sort(a,a+n); printf("%d",a[n-k]);
    return 0;
}

H. 方格染色

画几个图,大胆猜想答案就是 的最小非平凡因子,然后 A 了 (没错,我就是这么 A 的qwq)

Code:

using namespace std;
int n,m,k;
int main()
{
    scanf("%d%d",&n,&m);
    for (int k=2;k*k<=n*m;k++)
        if (n*m%k==0){printf("%d",k); return 0;}
    return 0;
}

I. 纪念币

枚举买入卖出点即可。

Code:

using namespace std;
const int N=1005;
int a[N],n,ans;
int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++) scanf("%d",a+i);
    for (int i=0;i<n;i++)
        for (int j=i;j<n;j++)
            ans=max(ans,a[j]-a[i]);
    printf("%d",ans);
    return 0;
}

J. 开火车

暴力模拟即可。

Code:

//#define DEBUG
#ifdef ONLINE_JUDGE
#undef DEBUG
#endif
using namespace std;
const int N=105,CARD_COUNT=52;
int card[N],box[N],top=0;
struct player
{
    int cd[N],tp;
    player(){tp=0;}
    inline void push(int x){cd[tp]=x; ++tp;}
    inline void repush(int x)
    {
        for (int i=tp-1;i>=0;i--) cd[i+1]=cd[i];
        cd[0]=x; ++tp; 
    }
    inline void pop()
    {
        --tp; int now=cd[tp];
        for (int i=0;i<top;i++)
            if (box[i]==now)
            {
                for (int j=i;j<top;j++) this->repush(box[j]);
                this->repush(now); top=i; return ;
            } box[top]=now; ++top;
    }
    inline bool empty(){return !tp;}
    inline int size(){return tp;}
    void output() // debug
    {
        printf("! ");
        for (int i=0;i<tp;i++) printf("%d ",cd[i]);
        puts("");
    }
}zcl,ajh;
void output() // debug
{
    printf("! ");
    for (int i=0;i<top;i++) printf("%d ",box[i]);
    puts("");
}
int main()
{
    for (int i=1;i<=CARD_COUNT;i++) scanf("%d",card+i);
    for (int i=CARD_COUNT;i>=1;i--)
    {
        if (i&1) zcl.push(card[i]);
        else ajh.push(card[i]);
    }
#ifdef DEBUG
    puts(" INIT : ");
    cout<<"card : "; output();
    cout<<"zcl  : "; zcl.output();
    cout<<"ajh  : "; ajh.output();
    puts("#==================================================================================#");
#endif
    for (int i=0;i<500;i++)
    {
#ifdef DEBUG
        cout<<i+1<<" : \n";
#endif
        if (zcl.empty()){puts("ajh"); return 0;} zcl.pop();
        if (ajh.empty()){puts("zcl"); return 0;} ajh.pop();
#ifdef DEBUG
        cout<<"card : "; output();
        cout<<"zcl  : "; zcl.output();
        cout<<"ajh  : "; ajh.output();
        puts("#==================================================================================#");
#endif
    }
    if (ajh.size()>zcl.size()) puts("zcl");
    else if (ajh.size()==zcl.size()) puts("no winner");
    else puts("ajh");
    return 0;
}

L. 正方形

一开始以为正方形一定和 轴平行,结果 WA 了。

正确做法是构建平行四边形,对每个平行四边形判定是不是正方形即可。

判定方法:看看四个点的连线是不是正好四个短两个长并且长的是短的的 倍。

Code:

using namespace std;
namespace Main
{
    struct point{int x,y;point(int X=0,int Y=0){x=X; y=Y;}}a,b,c;
    point Getans(const point& a,const point& b,const point& c){return point(a.x+c.x-b.x,a.y+c.y-b.y);}
    bool exists(const point& q){return ((a.x==q.x)&&(a.y==q.y))||((b.x==q.x)&&(b.y==q.y))||((c.x==q.x)&&(c.y==q.y));}
    inline double sqr(double x){return x*x;}
    inline double dist(const point& a,const point& b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
    bool equ(const double& x,const double& y){return x-y<1e-5;}
    bool is_square(const point& a,const point& b,const point& c,const point& d)
    {
        double dis[9]={dist(a,b),dist(a,c),dist(a,d),dist(b,c),dist(b,d),dist(c,d)};
        sort(dis,dis+6); reverse(dis,dis+6);
        int k=dis[0];
        return (equ(k,dis[1])&&equ(dis[2],dis[3])&&equ(dis[3],dis[4])&&equ(dis[4],dis[5])&&equ(k,dis[2]*sqrt(2)));
    }
    int main()
    {
        scanf("%d%d%d%d%d%d",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y);
        point ans;
#define check {if (is_square(a,b,c,ans)){printf("%d %d",ans.x,ans.y); return 0;}}
        ans=Getans(a,b,c); check;
        ans=Getans(a,c,b); check;
        ans=Getans(b,a,c); check;
        ans=Getans(b,c,a); check;
        ans=Getans(c,a,b); check;
        ans=Getans(c,b,a); check;
        return 0;
    }
}
int main(){return Main::main();}

M. 超市里的货物架

注意到答案必须呈


形式,并且重复一定会使得答案截断。

故直接暴力枚举即可,注意要去重。

Code:

using namespace std;
const int N=1005;
char a[N],b[N];
int n,m;
set<char> q;
int main()
{
    scanf("%d%d%s%s",&n,&m,a,b);
//    sort(a,a+n); sort(b,b+m); n=unique(a,a+n)-a; m=unique(b,b+m)-b;
// 因为在 set 里去重了,a 和 b 数组就不用去重了
    for (int i=0;i<n;i++)
        for (int j=0;j<m;j++)
            if (a[i]==b[j]){q.insert(a[i]); break;}
    printf("%d",int(q.size()));
    return 0;
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务