【第五届“图灵杯”NEUQ-ACM程序设计大赛】A C D【哈夫曼树】E【手写链表】 F G H【圆周排列生成】 I

59 篇文章 0 订阅
48 篇文章 0 订阅

A 逃出生天
题目描述:
gold学长从昏迷中醒来以后发现自己被困在一个山洞里,他找了很久,终于找到一个门。门上写着:想要逃出去,只有一个办法 你可以选择一个数n,设m=1 * 2 * … * (n-1)。如果m是n的倍数,那么门就会自动打开,否则你就别想出去了。 gold学长内心充满了绝望,他想了一些数,但他不知道这些数能不能保证自己逃出去。你能帮助gold学长逃出生天吗?
输入:
第一行一个数T(T<=1000),表示gold学长想的数的个数 接下来每一行一个数n(2<=n<=1e8),表示gold学长想的数
输出:
每行一个输出 对于每一个数,如果学长能逃出去,则输出“escape”(不含引号),否则输出“trapped”(不含引号)
Input
4
5
6
7
8
output

trapped
escape
trapped
escape
分析: 看题解上的是找规律,TAT ,我还给弄复杂了。我的想法是题意就是求 n | m=(n-1)! . 从算术基本定理角度考虑,我们假设
n = p1^r1 * p2^r2 * p3^r3 ……pn^rn
m= q1^s1 * q2^s2 * q3^s3 …….qm^sm
想要n是m的因子,我们可以认为p1到pn中所有的质因子m中都有, 同时对于n中质因子,m的相同的质因子指数 s >= r 才可以符合题意。

代码
.

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 1e5 ;

bool su[MAXN+2];int prm[MAXN+2],sz=0;
void init(){
    su[0]=su[1]=1;
    for(int i=2;i<=MAXN;i++){
        if(!su[i]) prm[++sz]=i;
        for(int j=1;j<=sz;j++){
            LL t=prm[j]*i;
            if(t>MAXN) break;
            su[t]=true;
            if(i%prm[j]==0) break;
        }
    }
    //printf("sz==%d\n",sz);
}
int n,m;
void solve(){
    bool flag=1; int nn=n;
    for(int i=1;i<=sz&&(LL)prm[i]*prm[i]<=n;i++) {
        //puts("==");
        if(n%prm[i]==0) {
            int ge=0;
            //puts("---");
            while(n%prm[i]==0) { ge++; n/=prm[i];}
            int cnt=0,m=nn-1;
            while(m) { cnt+=m/prm[i]; m/=prm[i];  }
            if(cnt<ge){
                flag=0;break;
            }
        }

    }

    if(flag&&n>1&&(nn-1)<n) flag=0;

    if(flag)  puts("escape") ;
    else puts("trapped");
}
int main(){
    int T ; init();
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        solve();
    }
return 0;
}

C 我爱数学
题目描述:
viewsetting特别喜欢数学,但是他算除法的时候特别不熟练,常常会出错。为了维持他对数学的兴趣,你能不能帮他做一下除法运算呢?
输入:
第一行是一个整数T(T≤1000),表明数据组数。 每组数据包括一行的两个整数a、b,用空格隔开。输入保证在int的范围内,且保证运算合法。
输出:
每组数据输出一行a÷b的值。保留6位小数。

2
114 514
1919 810

0.221790
2.369136

代码

#include<bits/stdc++.h>
using namespace std;
int main(){

    double a,b;
    int t;scanf("%d",&t);
    while(t--){
        scanf("%lf %lf",&a,&b);
        double c=a/b;
        printf("%.6f\n",c);
    }
return 0;
}

D PJ的 情书
题解连接
E: ingayass Bio Cards Collecting
题解链接

F Harry Potter And The Half-Blood Prince
题目描述:
这几天HBO一直在播放哈利波特系列电影,viewsetting觉得还行,就刷了一遍。哈利波特系列电影改编自J.K.Rowling的同名系列小说。在Harry Potter And The Half-Blood Prince中,哈利·波特和阿不思·邓布利多成功说服了霍拉斯·斯拉格霍恩重返学校,担任魔药课教师,而西弗勒斯·斯内普教授则如愿以偿,成为了黑魔法防御课老师。在第一节哈利·波特还没发到书的魔药课上,霍拉斯·斯拉格霍恩借给了哈利一本旧的魔药课课本。哈利发现,这本旧课本上面签着“Half Blood Prince”这个名字,此外这本书上还有很多笔记。可是问题来了,这个Half Blood Prince可不是等闲之辈,作为当年的学霸,他的学霸笔记可以让哈利波特的魔药学成绩提高到全班最高,然而他记笔记的习惯特别恶心。为了防止有人抄他的笔记,Half Blood Prince研制了一套密码笔记书写机制。他使用了一个函数转换他的笔记:对于a-z和A-Z这些拉丁字母,如果另a编号为0,b为1 ……依次类推,z为25。同样的A为0,B为1……Z为25。其实Half Blood Prince使用的是y=(kx+b)%26(%是取模运算符)的加密模式,也就是y是笔记上字符编号x对应的真实笔记的字符编号。那么举个栗子:假如这个密钥的加密模式是y=(x+1)%26,那么笔记中的“Bqtrg vhsg akcd.”应该表达的是“Crush with blade.”(注意除了大小写的字母外其他字符不用处理)。那么问题来了,为了让剧情发展下去,哈利波特告诉了你Half Blood Prince笔记的加密模式和参数k和b的值,你能设计一个解码程序,帮他还原学霸笔记,击败赫敏登上全班第一的宝座吗?
输入:
第一行两个整数k和b,均在一百以内,其中k>0,b>=0。第二行一个字符串(Length<=1000),代表Half Blood Prince的一条原始笔记。注意是多组输入。
输出:
这条笔记的真实版本,也就是根据转码规则得到的解码版本。

1 1
Bqtrg vhsg akzcd.

Crush with blade.

分析: 模拟就行,

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
char s[MAXN];
int main(){
    int k,b;
    while(scanf("%d%d",&k,&b)!=EOF){
        getchar();
        gets(s);int len=strlen(s);
        for(int i=0;i<len;i++){
            if(s[i]>='a'&&s[i]<='z') {
                int x=s[i]-'a';
                int y=(k*x+b)%26;
                putchar(y+'a');
            }else if(s[i]>='A'&&s[i]<='Z'){
                int x=s[i]-'A';
                int y=(k*x+b)%26;
                putchar(y+'A');
            }else putchar(s[i]);
        }
        puts("");
    }

return 0;
}

G Harry Potter and the Prisoner of Azkaban
题目描述:
Viewsetting又看了一部哈利波特系列电影:Harry Potter and the Prisoner of Azkaban(哈利·波特与阿兹卡班的囚徒)。电影里出现了一个魔法道具:活点地图。乍看之下,这张地图只是一张空白的羊皮纸;但是当使用者说出“我庄严宣誓我没干好事”(“我庄严宣誓我不怀好意”I solemnly swear that I am up to no good) ,墨线就会开始延伸,浮现出一张霍格沃茨的地图(包括秘密通道)。地图上有霍格沃茨里每个人所在的位置,并指示打开秘密通道的方法。使用完毕之后,只要说“恶作剧完毕”(Mischief managed),就可以将地图复原成空白的状态,以防止其他不知道地图口令的人使用。活点地图是莱姆斯·卢平、小矮星彼得、小天狼星布莱克以及詹姆·波特(哈利的爸爸)共同发明的,专门用来达成恶作剧。他们在就寝时间后,常常化身为动物四处探险,使得他们对霍格沃茨的地下通道有很多了解(布莱克,小矮星和波特是阿尼马格斯,而卢平是狼人。)他们将所发现的秘密通道,制作成活点地图。地图上写著这几位创造者的名字,他们采用仅限彼此所知的昵称(代表他们幻化成的动物):月亮脸(指身为狼人的卢平),虫尾巴(指小矮星,化身成老鼠),大脚板(布莱克,化身成狗),以及尖头叉子(波特,化身为雄鹿)。而这也是活点地图标题的由来。
哈利波特用这张地图可以说是开了外挂,游戏体验++,然而斯内普发现了哈利有这张地图,并且试图找出其中的秘密,但却被地图羞辱了一顿。卢平教授表示他会调查,就将地图带走了。可是现在哈利波特特别需要这张地图,于是他找到了你,帮他完成这个魔法地图。但是你只是一个麻瓜(不会膜法的普通人类),那里会这些骚操作?但是你可是会计算机的大手子啊!你就拥有那些魔法师眼中的“黑魔法”!请你编写一个程序,同样也能实现这个地图的功能。
输入:
多组输入,以EOF结束 每组第一行输入一个n(n<=999),代表记录中有n个魔法师。接下来n行,每行依次输入魔法师的名字,起始坐标和编号。其中坐标(x,y)意义是x坐标代表东西方向,x正方向为东。类似的,y是北正南负且坐标都是整数有序对。编号是三位的,如有前导零则要补足,编号不超过999。 接下来输入一个正整数k。然后接下来k行对应这地图的记录,如果这个魔法师移动了,依次输入其编号,方向(N为北,S为南,W为西,E为东),步数(正整数)。如果这个魔法师没有移动,格式是编号和”stay”。
输出:
和输入格式一样,按照序号从小到大的顺序换行输出魔法师的名字,当前坐标和编号。
5
Harry (1,1) 231
Hermione (2,2) 402
Ron (1,0) 311
Dumbledore (10,10) 000
Snape (-1,-1) 007
3
231 E 1
402 S 1
007 stay

Dumbledore (10,10) 000
Snape (-1,-1) 007
Harry (2,1) 231
Ron (1,0) 311
Hermione (2,1) 402

分析: 模拟就行。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN = 1000+11;
struct Infom{
    char name[1000];
    int x,y,id;
}node[MAXN];
int pos[MAXN];
bool cmp(Infom a,Infom b){
    return a.id<b.id;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        memset(pos,-1,sizeof(pos));
        for(int i=0;i<n;i++){
            scanf("%s (%d,%d) %d",node[i].name,&node[i].x,&node[i].y,&node[i].id);
            pos[node[i].id]=i;
        }
        int k;scanf("%d",&k);
        while(k--) {
            int id;char ch[10]; int step ;
            scanf("%d %s",&id,ch);
            if(ch[0]=='s') continue;
            scanf("%d",&step);
            if(ch[0]=='N') node[pos[id]].y+=step;
            else if(ch[0]=='S') node[pos[id]].y-=step;
            else if(ch[0]=='W') node[pos[id]].x-=step;
            else if(ch[0]=='E') node[pos[id]].x+=step;
        }
        sort(node,node+n,cmp);
        for(int i=0;i<n;i++)
            printf("%s (%d,%d) %03d\n",node[i].name,node[i].x,node[i].y,node[i].id);
    }
return 0;
}

H Lethe的手环
题解链接

I : 聪会长的关爱
题目描述:
大家都知道NEUQ-ACM俱乐部的会长聪聪是个英俊帅气的暖男,他最喜欢关心各路好看的妹子了。 这一天,他来到工学馆的一间教室,发现好多好多的漂亮小姐姐。但是小姐姐们都被一些丑陋的男人围着,聪聪很害怕,他不想得罪他们。 所以聪聪决定从一个小姐姐开始,把所有和她相邻的小姐姐,以及相邻的相邻的小姐姐(相邻小姐姐是指横、竖或对角线方向的第一位小姐姐)都关心一遍,而不跨过那些丑陋的男人。 请问聪聪最多能关心到多少个小姐姐?
输入:
多组输入。 每组第一行输入两个数m和n(0 < m , n < =1000),表示教室的大小,有m行n列的座位。当m和n为0时停止程序。 输入一个教室的人员分布图,用一个矩阵表示,其中“@”表示小姐姐,“*”表示丑陋的男人。
输出:
每组输出一行一个数字,表示聪聪最多能撩到的小姐姐数量。

5 5
**@
@@@
@*@
@@@*@
@@**@
0 0

8

分析: 就是求联通快问题。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000+11;
int n,m;
int mp[MAXN][MAXN];
int to[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,-1,-1,1,1,-1}; // 这里注意是8个方向
int cnt;
void DFS(int x,int y){
    mp[x][y]=0; cnt++;
    for(int i=0;i<8;i++) {
        int nx=x+to[i][0];
        int ny=y+to[i][1];
        if(mp[nx][ny]) DFS(nx,ny);
    }
}
char s[MAXN];
int main(){
    while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            for(int j=0;s[j];j++)
                if(s[j]=='@') mp[i][j+1]=1; // 1代表小姐姐
                else mp[i][j+1]=0; //0 代表边界和丑男
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++) {
                if(mp[i][j]) {
                    cnt=0;  DFS(i,j);
                    ans=max(ans,cnt);
                }
            }
        }
        printf("%d\n",ans);
    }
return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值