问题一:
牛牛找工作
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 牛牛找工作
/***************************************************************************
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
while (cin >> n >> m)
{
vector<pair<int, int> > job(n + 1), guy(m);
vector<int> map(m);
int mx = 0, index = 0, left = 0;
job[0] = make_pair(0, 0);
for (int i = 1; i <= n; ++i)
{
cin >> job[i].first >> job[i].second;
}
for (int i = 0; i < m; ++i)
{
cin >> guy[i].first;
guy[i].second = i;
}
sort(job.begin(), job.end(), [&](pair<int, int> a, pair<int, int> b) {return a.first < b.first; });
sort(guy.begin(), guy.end(), [&](pair<int, int> a, pair<int, int> b) {return a.first < b.first; });
for (int i = 0; i <= n; ++i)
{
mx = max(mx, job[i].second);
job[i].second = mx;
}
while (left < m && index < n + 1)
{
if (guy[left].first >= job[index].first)
++index;
else
{
map[guy[left].second] = job[index - 1].second;
++left;
}
}
for (int i = left; i < m; ++i)
{
map[guy[i].second] = job[n].second;
}
for (int i = 0; i < m; ++i)
{
cout << map[i] << endl;
}
}
}
问题二:
被3整除(找规律题)
小Q得到一个神奇的数列: 1, 12, 123,…12345678910,1234567891011…。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 被3整除
/***************************************************************************
#include<stdio.h>
int main()
{
int l = 0, r = 0;
int result = 0;
scanf_s("%d%d", &l, &r);
for (int i = l; i <= r; i++)
{
switch (i % 3)
{
case 0:result++; break;
case 1:; break;
case 2:result++; break;
}
}
printf("%d\n", result);
}
问题三:
安置路灯
小Q正在给一条长度为n的道路设计路灯安置方案。
为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用’.’表示, 不需要照亮的障碍物格子用’X’表示。
小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。
小Q希望能安置尽量少的路灯照亮所有’.’区域, 希望你能帮他计算一下最少需要多少盏路灯。
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 安置路灯
/***************************************************************************
#include<stdio.h>
#include<string.h>
int calcu(int len, char str[]);
struct node
{
int length;
char str[1000];
};
int main()
{
int t = 0;
node road[1000] = { 0 };
int cnt = 0;
scanf("%d", &t);
for (int i = 0; i<t; i++)
{
scanf("%d", &road[i].length);
scanf("%s", &road[i].str);
}
for (int i = 0; i<t; i++)
{
cnt = calcu(road[i].length, road[i].str);
printf("%d\n", cnt);
}
return 0;
}
int calcu(int len, char str[])
{
int result = 0;
for (int i = 0; i<len;)
{
if (str[i] == 'X')
{
i++;
continue;
}
if (str[i] == '.' || str[i + 1] == '.' || str[i + 2] == '.')
{
result++;
}
i += 3;
}
return result;
}
问题四:
迷路的牛牛
牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 迷路的牛牛
/***************************************************************************
#include<stdio.h>
#include<string.h>
int main()
{
int N = 0;
char direct[1001];//字符串输入还有一个空字符加入尾巴;所以长度要加1,为1001
char pre = 'N';
char result;
scanf_s("%d", &N);
scanf_s("%s", direct);
for (int i = 0; i<N; i++)
{
switch (pre)
{
case 'E':
{
if (direct[i] == 'L')
pre = 'N';
else
pre = 'S';
break;
}
case 'W':
{
if (direct[i] == 'L')
pre = 'S';
else
pre = 'N';
break;
}
case 'N':
{
if (direct[i] == 'L')
pre = 'W';
else
pre = 'E';
break;
}
case 'S':
{
if (direct[i] == 'L')
pre = 'E';
else
pre = 'W';
break;
}
}
}
printf("%c", pre);
return 0;
}
问题五:
数对
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 数对
/***************************************************************************
#include<stdio.h>
int main()
{
long long result = 0;
int n = 0, k = 0;
scanf_s("%d%d", &n, &k);
for (int y = k+1; y<= n; y++)
{
result += (n / y)*(y - k) + (n %y - k + 1>0? n % y - k + 1: 0);
if (k == 0)
result--;
}
printf("%lld", result);
return 0;
}
问题六:
矩形重叠
平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
思路:(注意判断重叠矩形数量最多的地方:遍历所有可能包含的点,看一下有多少矩形包含它
注:重叠数量最多的地方肯定是一块矩形区域
误区:A和B交,B和C交,但是A不和C交 — B同时和A,C交, 但是重叠区域只为1)
/***************************************************************************
* @file python 2.7.3
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 矩形重叠
/***************************************************************************
import sys
lines = sys.stdin.readlines()
n = int(lines[0])
x1 = list(map(int, lines[1].split()))
y1 = list(map(int, lines[2].split()))
x2 = list(map(int, lines[3].split()))
y2 = list(map(int, lines[4].split()))
res = 1
for x in x1 + x2:
for y in y1 + y2 :
cnt = 0
for i in range(n) :
if x > x1[i] and y > y1[i] and x <= x2[i] and y <= y2[i]:
cnt += 1
res = max(res, cnt)
print(res)
问题七:
牛牛闹钟
牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要X分钟到达教室,上课时间为当天的A时B分,请问他最晚可以什么时间起床
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 牛牛闹钟
/***************************************************************************
#include<stdio.h>
#include<algorithm>
using namespace std;
struct clock_niu
{
int H;
int M;
int id;
};
int main()
{
int N = 0;
clock_niu clo[100];
int X = 0;
int clock_minute[100];
int clock_minute0[100];
int pos[100] = { 0 };
int min = 0;
int temp = 0;
int target = 0;
clock_niu classs;
scanf_s("%d", &N);
for (int i = 0; i<N; i++)
{
scanf_s("%d%d", &clo[i].H, &clo[i].M);
clo[i].id = i;
clock_minute[i] = clo[i].H * 60 + clo[i].M;
}
scanf_s("%d", &X);
scanf_s("%d%d", &classs.H, &classs.M);
target = classs.H * 60 + classs.M;
memcpy(clock_minute0, clock_minute, N*sizeof(int));
sort(clock_minute,clock_minute+N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (clock_minute0[j] == clock_minute[i])
{
pos[i] = j;
break;
}
}
for (int i = N - 1; i >= 0; i--)
{
if (clock_minute[i]<target&&target - clock_minute[i] >= X)
{
printf("%d %d\n", clo[pos[i]].H, clo[pos[i]].M);
break;
}
}
return 0;
}
问题八:
每题得分
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。
//如果所有物品加起来都没超过总重量,那么直接可以使用使用公式 nums = pow(2,n); //如果所有物品加起来没有超过总重量,这题由于总容量很大,不考虑动态规划。
//然而发现物品很少,不超过30个,那么考虑使用深搜。 代码如下:
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 13 August 2018
* @remark 13 August 2017
* @theme 每题得分
/***************************************************************************
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long nums = 1;
void DFS(vector<long long>& array, int size, long long w, long long sum, int pos)
{
if (sum <= w)
{
nums++;
for (int i = pos + 1; i < size; ++i)
{
DFS(array, size, w, sum + array[i], i);
}
}
}
int main()
{
int n;
long long w;
cin >> n >> w;
long long total = 0;
vector<long long > array(n, 0);
for (int i = 0; i != n; ++i)
{
cin >> array[i];
total += array[i];
}
if (total <= w)
{
nums = pow(2, n);
}
else
{
sort(array.begin(), array.end());
for (int i = 0; i != n; ++i)
DFS(array, array.size(), w, array[i], i);
}
cout << nums << endl;
return 0;
}