oj

北航OJ 转圈圈问题

房东的猫 提交于 2020-03-02 10:16:27
本题要求你输出一个尺寸为d×d的数阵,数字的排列方式是从1到n循环且顺时针转圈,看样例输出。 输入 两行,第一行是正整数n(n<10),第二行是正整数d(d<20) 输出 转圈圈的数阵 输入样例1 6 4 输出样例1 1 2 3 4 6 1 2 5 5 4 3 6 4 3 2 1 输入样例2 5 5 输出样例2 1 2 3 4 5 1 2 3 4 1 5 4 5 5 2 4 3 2 1 3 3 2 1 5 4 循环可以通过对数取模得到。矩阵可以用二维数组模拟。 麻烦在于模拟人转圈写数的过程,可以将每一圈看作一个循环。用一个变量n来标记写数的次数,当写数次数用尽时,循环结束。 奇数的情况下,正中间的最后一个数会出现问题,可以在最后加一个if语句进行完善。 这里用python实现。 a=int(input()) b=int(input()) c=[] n=b**2 x=b t=1 line=x # 生成n*n维数组 for i in range(b): c.append([]) for i in range(b): for j in range(b): c[i].append(0) while n: for j in range(2*x-b-1): c[b-x][j+b-x]=t n-=1 t+=1 for j in range(2*x-b-1): c[j+b-x][x-1]=t n-

杭电oj——2035——人见人爱A^B——【题解】

一曲冷凌霜 提交于 2020-03-01 18:38:41
谢谢你,成为我的星辰@球球 传送门: 人见人爱的A,B 思路:这个题其实如果用pow,肯定会爆long long,可以用同余方程,和快速幂取模: 同余方程AC代码: #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; int main() { int n,m; while(cin>>n>>m&&(n||m)) { int s=1; for(int i=1;i<=m;i++) { s=(s*n)%1000; } printf("%d\n",s); } return 0; } 快速幂取模:这里我就不讲太多的原理了;看到几篇比较好的原理博客,我就直接借鉴大佬的了; 1. C++ 快速幂取模算法 2. 快速幂、快速幂取模的分析与代码实现 AC代码: #include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<iomanip> #include<algorithm> using namespace std; typedef long long ll; ll quick_mod(ll m

东华OJ基础题77 回文问题

一曲冷凌霜 提交于 2020-03-01 12:01:14
问题描述 : 输入一串字符,其长度小于200,判断该串字符是否构成回文。 所谓回文是指从左到右和从右到左读一串字符的值是一样的,如:ABCBA。 输入说明: 你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行字符组成,它们之间没有空格,在行首和行尾没有多余的空格。 输出说明 : 对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案:构成回文的输出Yes ,反之输出 No。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。 输入范例 : abcba abcbb 输出范例: Yes No 总结 1.简单,无难度 2.加油!!! # include <stdio.h> # include <ctype.h> # include <string.h> int main ( ) { int len , i , j , flag ; char str [ 101 ] ; while ( gets ( str ) ) { flag = 1 ; len = strlen ( str ) ; for ( i = 0 , j = len - 1 ; i < len / 2 ; i ++ , j -- ) { if ( str [ i ] != str [ j ] ) { printf ( "No\n" ) ; flag = 0

东华OJ 基础题 70 日期

血红的双手。 提交于 2020-03-01 07:47:17
问题描述 : 输入星期日到星期六的英文缩写(Sun,Mon,Tue,Wed,Thu,Fri,Sat),输出其对应的完整单词。 输入说明 : 你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每行输入相关单词,在行首和行尾没有多余的空格。 输出说明 : 对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端,例如你在Windows中启动该程序所用的命令行终端)依次输出从标准输入设备中读入的每一组测试数据对应的结果。所有数据前后没有多余的空行,两组数据之间也没有多余的空行。每组输出数据由一行组成,该行为该英文单词的全称。 输入范例 : Sun Sat 输出范例: Sunday Saturday 总结 1.这个题比较简单,我这里主要使用了一个string函数 里面的strncmp(字符串1,字符串,n)``` 功能:将字符串1中最多n个字符与字符串2进行比较; 两者相等,返回值为0;字符串1大于字符串2,返回值为一正整数;否则,为一负整数。 2.加油!!! #include<stdio.h> #include<string.h> int main(){ char str[101]; while(gets(str)){ if(strncmp("Monday",str,3)==0) printf("Monday\n"); if(strncmp("Tuesday"

东华OJ 基础题75 弟弟的作业

老子叫甜甜 提交于 2020-03-01 03:41:00
问题描述 : 你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。 输入说明 : 输入文件包含不超过100行,以文件结束符结尾。每行包含一道题目,格式保证符合上述规定,且不包含任何空白字符。输入的所有整数均不含前导0。 输出说明 : 输出仅一行,包含一个非负整数,即弟弟答对的题目数量。 输入范例 : 55+12=67 15-8=7 100-35=? 83-50=33 4-3=6 81+5=21 输出范例 : 3 总结 1.这道题看起来很简单,嗯…,这里在书上看到了stdio.h里面的函数,除了gets和puts,还有其他用于字符串输入输出的函数 sprintff()、sscanf(),上网搜说类似正则表达式,介绍的一些实例看起来还是很厉害的(我都没用过) 2.还有个函数在书上找的strchr(数组名。‘要寻找的字符’),在指定字符串中查找指定字符,若找到,函数返回该字符第一次出现的内存位置,否则返回0;这样一来我很快就能找到是否含有‘?’,太含有技术量了,可能我自己在考场上就想不起来用这招 # include <stdio.h> # include <ctype

东华OJ 进阶21 回文质数

时光怂恿深爱的人放手 提交于 2020-02-29 17:11:13
问题描述 : 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 号是回文质数。写一个程序来找出范围[a,b](5<= a < b <= 100,000)间的所有回文质数 输入说明 : 仅 1 行: 二个整数 a 和 b(5<= a < b <= 100,000)。 输出说明 : 输出一个回文质数的列表,一行一个。 每行首尾无空格,最后无空行。 #include <stdio.h> #include <string.h> int zhishu(int n){ for(int i=2;i<n;i++) if(n%i==0) return 0; return 1; } int huiwen(int n){ int a[10]={0}; int flag=0; while(n){ a[flag]=n%10; flag++; n/=10; } for(int i=0;i<=(flag/2);i++){ if(a[i]!=a[flag-i-1])return 0; } return 1; } int main(){ int a,b; scanf("%d %d",&a,&b); for(int i=a;i<=b;i++){ if(huiwen(i)&&zhishu(i)) printf("%d\n",i); } return 0; } 来源: CSDN 作者:

杭电OJ 1177(C++)

痴心易碎 提交于 2020-02-28 21:16:07
基础题,结构体排序。 首先读入所有选手的解题数量和用时,将用时转换为秒。 然后排序,解题数量不同时,解题数量多的排在前面;解题数量相同时,用时少的排在前面。 最后根据金银铜牌数量和选手所在名次决定输出。 #include <iostream> #include <string> #include <algorithm> using namespace std; const int MAXN = 135; struct participant //参赛选手 { int solve; //解题数量 int time; //用时 int num; //序号 }p[MAXN]; //排序条件,解题数量不同时,解题数量多的排在前面 //解题数量相同时,用时少的排在前面 bool cmp(participant p1, participant p2) { if (p1.solve != p2.solve) return p1.solve > p2.solve; else return p1.time < p2.time; } int main() { int N, G, S, C, M; while (cin >> N >> G >> S >> C >> M) { if (N == 0 && G == 0 && S == 0 && C == 0 && M == 0) break; string

SWUST OJ 964: 数细胞

柔情痞子 提交于 2020-02-27 14:25:29
964.数细胞 题目链接-964.数细胞 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。 输入 第一行输入两个整数,分别代表矩阵的行和列 输入m*n的矩阵,由数字0到9组成 输出 细胞个数 样例输入 4 10 1 2 3 4 5 1 1 1 6 7 1 0 3 4 5 6 1 5 1 0 2 0 4 5 6 6 1 6 7 1 0 0 6 0 6 6 1 0 8 9 样例输出 1 解题思路 dfs简单题,统计连通区域 题目代码要求用bfs(队列),但是我还是想用dfs (手动滑稽(~ ̄▽ ̄)~) 数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是(非零)细胞数字则为同一细胞 因为0不是细胞数字,在输入的时候对0就进行处理,用vis数组标记为1 深度优先搜索,即遍历矩阵时候,如果该细胞数字没有被搜索过,即vis[i][j]=0,则进行dfs搜索,先将这个位置用vis数组标记为1,以免重复遍历,然后再排查其相邻的所有范围是否有非0数字,有则用vis数组标记为1(因为相邻的话就算作一个细胞了) num用来计数,因为每次搜索的时候与maze[i][j]同一细胞的细胞数字已经被标记,所以每次搜索后+1即可 附上代码 # include <bits/stdc++.h> # define int

dp之区间:Light oj 1422 Halloween Costumes

邮差的信 提交于 2020-02-27 04:01:47
http://lightoj.com/volume_showproblem.php?problem=1422 题意: 给你n天需要穿的衣服的样式,每次可以套着穿衣服,脱掉的衣服就不能再穿了,问至少要带多少条衣服才能参加所有宴会 思路:我们从后往前推导,dp[i][j]代表从区间i到区间j最少的穿衣数量,那么在dp[i][j]这个状态的穿衣数,就要等于dp[i+1][j]+1;也就是说,首先在不考虑它后面是否有一天要穿相同的衣服的情况下,它肯定会比区间i+1到j的衣服多出一件; 然后,再考虑在这个区间范围,是否有一天要穿相同的衣服,i<k<=j,如果有第k天衣服和第i天的衣服是一样的,那么就要比较如果第i天不穿1件衣服与第i天穿上1件衣服; 首先,第i天穿上一件衣服的结果已经得出,那么我们只需比较不穿衣服,那么就是dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]); 在处理状态的时候,是从n往1推导的状态....... #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[105][105],a[105]; int min(int x,int y) { if(x>y) return y; else return x; } int

东华oj-进阶题第31题

我只是一个虾纸丫 提交于 2020-02-27 03:01:52
31 最高频率 作者: 朱凯时间限制: 10S章节: 一维数组 问题描述 : 明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋,因此有意培养他对数学的兴趣。一次,明明的爸爸和明明玩起了一个数字游戏,这个游戏的名字叫“最高频率”。在游戏中,明明的爸爸要求明明在一串数字中,找出出现次数最多的那个数字,如果有多个数字出现的次数一样,则取最小的那个数字。明明很快就理解的游戏的规则,开始玩起来。明明的爸爸首先给了明明三个数字:3、2、1;明明很快就回答说:“1”(虽然3、2都出现一次,但是1是最小的数字,因此答案是1)。明明的爸爸很惊讶于明明的反应速度,开始加大游戏的难度,给出了由6个数字组成的数字串:2、1、3、4、5、2;明明眼珠子一转,脱口而出:“2”。明明的爸爸意识到简单的数字串很难难住明明,于是决定给出很长的一串字符串来考明明。但与此同时,明明爸爸面对这很长的数字串,也无法一时就统计出哪个数字出现的次数最高。于是就求助于你,让你帮他写一个程序,用来计算出出现次数最多的那个数字。 明明的爸爸的问题可以归结为:给你一个数字串,里面有n个数字,输出这个数字串中出现次数最多的那个数字;如果有多个数字出现次数一样,则输出其中最小的那个数字。 输入说明 : 你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行开始有一个正整数n(1