17HNUCM计科练习14题解(油田问题,马的遍历)

目录

ly的小迷弟

 wjw的星期五

汽车加油问题

ABC + DEF = GHI

油田问题

马的遍历问题


ly的小迷弟

题目描述

众所周知ly虽然是个小胖子,但是长得还是很好看的,所以她有很多小迷弟(bu cun zai de),但是ly当然不是个只看颜值的人了,所以在她觉得颜值还可以的所有人里,把这些人选出来按照智商排序...
虽然wjw不是ly的小迷弟,但是wjw很想知道某个智商值在这群人里能排多少名,那么只能麻烦你帮他了

输入

第一行一个整数N表示有N个被选出来的小迷弟
第二行N个整数分别表示这N个小迷弟的智商
接下来若干行表示wjw的询问,每行一个智商值

输出

每行一个整数表示答案

样例输入 Copy

5 
1 2 3 4 5 
1 
2 
3 
4 
5

样例输出 Copy

1
2
3
4
5

提示

0<=智商<=2^31-1
0<=N<=1000000

大量的输入输出,建议使用scanf,printf代替cin,cout,使用BufferReader代替Scanner

#include
using namespace std;
int a[1000010];
int main()
{
	int n,i,m;
	scanf("%d",&n);
	for(i=0;i=m)
			{
				r=mid-1;
			}
			else l=mid+1;
		}
		printf("%d\n",l+1);
	}
	return 0;
}

 wjw的星期五

题目描述

wjw最近运气极其差,什么roll点1-100连着十次都是个位数啊,买个珍珠奶茶没有珍珠啊,吃方便面没有调料包啊...
迷信的wjw觉得,一定是因为这个月的13号正好是星期五,才会导致他的运气这么差。
现在他想知道,在某个年份中,有多少个月的13号是星期五,这样他才可以提前做好心理准备。
PS.已知1998年1月1日是星期四,输入的年份肯定大于或等于1998年。

输入

input
输入只有一行,表示年份(大于等于1998年)

输出

output
输出只有一行,表示这一年中有多少个月的13号是星期五

样例输入 Copy

1998

样例输出 Copy

3

提示

 说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;

#include
using namespace std;
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int aa(int n){
    int day;
    if(n%4==0&&n%100!=0||n%400==0){
        m[1]=29;
        day=366;
    }else{
        m[1]=28;
        day=365;
    }
    return day;
}
int main()
{
	int n;
	int i;
	while(~scanf("%d",&n)){
        int ans=0;
        long long d=0;
        for(i=1998;i

 

汽车加油问题

题目描述

一辆汽车加满油后可以行驶n千米。旅途中有k个加油站。若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。

 

输入

第一行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油,且在第0个加油站满油不算加油,第k+1个加油站表示目的地。(请处理到文件尾)

 

输出

最少加油次数。如果无法到达目的地,则输出“No Solution”。

 

样例输入 Copy

7 7
1 2 3 4 5 1 6 6

样例输出 Copy

4
#include

using namespace std;

int a[100005];
void aa(int n,int k){
    int ans=0;
    int s=0;
    for(int i=0;i<=k;++i){
        if(a[i]>n){
            cout<<"No Solution"<n){
            ans++;
            s=a[i];
        }
    }
    cout<>n>>k){
        for(int i=0;i<=k;++i)
            cin>>a[i];
        aa(n,k);
    }
    return 0;
}

 

ABC + DEF = GHI

题目描述

用1, 2, 3...9 这九个数字组成一个数学公式,满足:ABC + DEF = GHI,每个数字只能出现一次,编写程序输出所有的组合。

输入

输出

输出所有的 ABC + DEF = GHI,
每行一条数据,格式为ABC+DEF=GHI
输出结果按照ABC升序排列,如果ABC相同,则按照DEF升序排列。

#include
using namespace std;
int a[15]={0};
int b[15]={0};
void dfs(int n){
    int i;
    if(n==10){
        int x,y,z;
        x=a[1]*100+a[2]*10+a[3];
        y=a[4]*100+a[5]*10+a[6];
        z=a[7]*100+a[8]*10+a[9];
        if(x+y==z){
            printf("%d+%d=%d\n",x,y,z);
        }
        return ;
    }
    for(i=1;i<10;++i){
        if(b[i]==0){
            a[n]=i;
            b[i]=1;
            dfs(n+1);
            b[i]=0;
        }
    }
}
int main(){
    dfs(1);
	return 0;
}

 

油田问题

题目描述

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。

输入

输入行数m,已经列数n。
然后输入*和@

输出

联通块个数

样例输入 Copy

5 5
****@
*@@*@
*@**@
@@@*@
@@**@

样例输出 Copy

2
#include
#include
#include
#include
#include
using namespace std;

int m,n;
const int maxn = 1005;
char a[maxn][maxn];
int vis[maxn][maxn];

void dfs(int x, int y, int ans) {
	if (x<0||x>=m||y<0||y>=n)
        return;
	if (vis[x][y]>0||a[x][y]!='@')
        return;
	vis[x][y]=ans;
	for(int i=-1;i<=1;i++)
        for(int j=-1;j<=1;j++)
            if (i||j)
                dfs(x+i,y+j,ans);
}
int main(){
	while (cin>>m>>n){
		for(int i=0;i>a[i];
		memset(vis,0,sizeof(vis));
		int ans=0;
		for(int i=0;i

 

马的遍历问题

题目描述

在5*4的棋盘中,马只能走斜“日”字。马从位置(x, y)处出发,把棋盘的每一格都走一次,且只走一次,请找出所有路径。

输入

x,y,表示马的初始位置。

输出

将每一格都走一次的路径总数,如果不存在该路径则输出“No solution!”。

 

样例输入 Copy

1 1
2 2

样例输出 Copy

32
No solution!
#include
#include
#include
#include
#include
using namespace std;

int m=5,n=4;
int fx[8]={1,2,2,1,-1,-2,-2,-1};
int fy[8]={2,1,-1,-2,-2,-1,1,2};
int a[10][10];
int ans;

int check(int x,int y){
    if(x>=0&&x=0&&y>a1>>a2){
		ans=0;
		memset(a,0,sizeof(a));
		--a1;
		--a2;
		a[a1][a2]=1;
		dfs(a1,a2,1);
		if(ans==0){
            cout<<"No solution!"<

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(算法学习)