2017年杭電計算機研究生復試筆試題目


//2017 N1
/*關羽過關斬三將,輸入四個人的武力值(大於0小於50),若超過界限需要重新輸入,關羽的武力值x,將士武力值為y,滿足(x-y)^2+(x-y)+41 若為素數則關羽獲勝,若關羽三次獲勝輸出WIN,若失敗則輸出失敗的將領序號(第幾關)。*/
#include<stdio.h>
#include<math.h>
int is_prime(int n)
{
int i;
for ( i = 2; i <= sqrt(double(n)); i++)
{
if (n%i==0)
{
break;
}
}
//假如是素數
if (i>sqrt(double(n)))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int x, y[4];
int i;
int sum = 0;
while (~scanf("%d",&x))
{
for (i = 1; i < 4; i++)
{
scanf("%d", &y[i]);
}
for ( i = 1; i < 4; i++)
{
sum = (x-y[i]) *(x-y[i]) + (x - y[i]) + 41;
//如果第三次也是素數
if (is_prime(sum)&&i==3)
{
printf("WIN\n");
}
//如果當前的sum不是素數,則就輸出第幾關,跳出循環
else if (!is_prime(sum))
{
printf("第%d關\n",i);
break;
}
//如果當前的sum是素數,則就繼續
else
{
continue;
}
}
}
return 0;
}

 

 

//N2
/*輸入N個員工,每個員工輸出ID號,上班時間,下班時間,第一行輸出最早去的員工的ID和上班時間第二行輸出最遲走的員工的ID和下班時間第三行輸出工作最久的員工的ID和上班時間(數據瞎編的)
sampleinput:
ID100001,07:00:0017:00:00
ID100002,08:00:0018:00:00
ID100003,09:00:0021:00:00
sampleout:
OPEN:ID100001,07:00:00
CLOSE:ID100003,21:00:00
(..):ID100003,12:00:00
*/
#include<stdio.h>
#include<algorithm>
#define N 100
typedef struct time
{
int hour;
int min;
int sec;
}time;
typedef struct Person
{
char id[N];
struct time t1,t2;
int worktime;
}Person;
Person p[N];
//第一行:最早去的員工的ID和上班時間;
//第二行:最遲走的員工的ID和下班時間;
//第三行:輸出工作最久的員工的ID和上班時間

//比較員工的上班時間的早晚,得出上班時間早的,先比較小時,再比較分,最后比較秒,從高到底
bool cmp1(const Person& p1,const Person& p2)
{

if (p1.t1.hour!=p2.t2.hour)
{
return p1.t1.hour < p2.t1.hour;
}
else if (p1.t1.min!=p2.t1.min)
{
return p1.t1.min < p2.t1.min;
}
else
{
return p1.t1.sec < p2.t1.sec;
}
}
//比較員工的下班時間早晚,降序排序
bool cmp2(const Person& p1, const Person& p2)
{

if (p1.t1.hour != p2.t2.hour)
{
return p1.t1.hour > p2.t1.hour;
}
else if (p1.t1.min != p2.t1.min)
{
return p1.t1.min > p2.t1.min;
}
else
{
return p1.t1.sec > p2.t1.sec;
}
}
//求工作時間,還有一種簡單直接的方法,就是全部轉化為秒,再相減;下面的方法稍微麻煩
int cal_work_time( Person& p1)
{
/*int sum=0,sum1=0,sum2=0;
sum1=p1.t1.hour*3600+p1.t1.min*60+p1.t1.sec;
sum2=p1.t2.hour*3600+p1.t2.min*60+p1.t2.sec;
sum=sum2-sum1;
p1.worktime=sum;
*/
//p1.t2與p1.t1的差,先做秒的差值,再做分鍾的差值,最后做時的差值
int sum = 0;
//當下班時間的秒鍾比上班時間的秒鍾大
if (p1.t2.sec>p1.t1.sec)
{
sum = sum + (p1.t2.sec - p1.t1.sec);
}
//當下班時間的秒鍾比上班時間的秒鍾小,則向下班時間的分鍾減去一
else
{
p1.t2.min -= 1;
sum = sum + (p1.t1.sec - p1.t2.sec);
}
//當下班時間的分鍾比上班時間的分鍾大
if (p1.t2.min>p1.t1.min)
{
sum = sum + 60*(p1.t2.min - p1.t1.min);
}
//當下班時間的分鍾比上班時間的分鍾小,則向下班時間的時鍾減去一
else
{
p1.t2.hour -= 1;
sum = sum + 60 * (p1.t1.min - p1.t2.min);
}
//當下班時間的時鍾比上班時間的時鍾大
sum = sum + 3600 * (p1.t2.hour - p1.t1.hour);
return sum;
}
//輸出工作最久的員工的ID和上班時間,要先算出工作時間
bool cmp3(Person& p1, Person& p2)
{
p1.worktime = cal_work_time(p1);
p2.worktime = cal_work_time(p2);
return p1.worktime > p2.worktime;
}
using namespace std;
int main()
{
int n;
int i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s%d%d%d%d%d%d%d", p[i].id, &p[i].t1.hour, &p[i].t1.min,&p[i].t1.sec,&p[i].t2.hour,&p[i].t2.min,&p[i].t2.sec,&p[i].worktime);
//用cmp1,排序后的第一個人是上班時間最早的
sort(p, p + n, cmp1);
printf("上班時間最早的員工其ID是:%s;其上班時間為:%d-%d-%d", p[0].id, p[0].t1.hour, p[0].t1.min, p[0].t1.sec);
//用cmp2,排序后的第一個人是下班時間最晚的
sort(p, p + n, cmp2);
printf("下班時間最晚的員工其ID是:%s;其下班時間為:%d-%d-%d", p[0].id, p[0].t2.hour, p[0].t2.min, p[0].t2.sec);
//用cmp3,排序后
sort(p, p + n, cmp3);
printf("工作時間最晚的員工其ID是:%s;其上班時間為:%d-%d-%d", p[0].id, p[0].t1.hour, p[0].t1.min, p[0].t1.sec);
}
return 0;
}

 

//N3
/*有一個M*N的材料和一個s*t的模板,從材料中切除模板,求最大能切出來的模板的數量。
sample input

3 4
a b c d
c d a b
a c c d
2 2
a b
c d
sample out
2 */
#include<stdio.h>
#define MX 100
#define MY 100
char map1[MX][MY];//存儲大圖
char map2[MX][MY];//存儲小圖
int N, M, n, m;
int ans;
int max;
//判斷大圖里面是否包含小圖
bool judge(char Map[MX][MY], int x, int y)
{
for (int i = 0; i < m;i++)
{
for (int j = 0; j < n; j++)
{
if (Map[x+i][y+j]!=map2[i][j])
{
return false;
}
}
}
return true;
}
void dfs(char map[MX][MY],int x,int y,int max)
{
if (max>ans)//更新答案
{
ans = max;
}
if (y>=n)
{
return;
}
//第一列走完,換第二列
if (x >= m)
{
dfs(map, 0, y + 1, max);
}
else
{
if (judge(map,x,y))
{
char temp[MX][MY] = { 0 };
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
temp[i][j] = map[i][j];
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
temp[x + i][y + j] = '0';
}
}
dfs(temp, x + m, y, max + 1);//確定取這一塊兒
dfs(map, x + 1, y, max);//不取這一塊兒,按部就班繼續走
}
else
{
dfs(map, x + 1, y, max);//不匹配則按列走
}
}

}
int main()
{
//int M, N;
int i, j;
scanf("%d%d", &M, &N);
//將大圖讀入
for (i = 0; i < M; i++)
{
for ( j = 0; j < N; j++)
{
scanf("%c%c", &map1[i][j]);
}
}
//將小圖讀入
//int m, n;
scanf("%d%d", &m, &n);
for ( i = 0; i < m; i++)
{
for ( j = 0; j < n; j++)
{
scanf("%c%c", &map2[i][j]);
}
}
ans = 0;
dfs(map1, 0, 0, 0);
printf("%d\n", ans);
return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM