星系炸弹:2014年11月9日的1000天后是哪一天
#include <stdio.h>
int main()
{
int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//用数组记录每个月的时间;
int days = 1000;
int year = 2014, month = 11, day = 9;
int i;
for (i = 0; i < days; i++)//逐一遍历;
{
day++;//计算日
if (day > monthDays[month - 1])
{
day = 1;
month++;
if (month > 12)//一年到了更新月、年的值
{
month = 1;
year++;
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))//判断闰年
monthDays[1] = 29;
else
monthDays[1] = 28;
}
}
}
printf("%d-%d-%d\n", year, month, day);
getchar();
return 0;
}
蛇形填数
关键: 临界点的转移
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i = 0;
int j = 0;
int cnt = 2;
int a[250][250];
a[0][0] = 1;
while (cnt < 1000)//遍历
{
j++;
while (i != -1 && j != -1)
{
a[i][j] = cnt++;
if (j == 0) //到达左边界;
break;
i++;//未到左边界 继续向左下方移动;
j--;
}
i++;//到达左边界 行号+1;开始向右上方移动
while (i != -1 && j != -1)
{
a[i][j]=cnt++;
if(i==0) break;//到达上边界
i --;
j ++;
}
}
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
cout << setw(5) << a[i][j] << ' ';
}
cout << '\n';
}
cout << a[19][19];
return 0;
}
日志统计
题目描述
小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N 行。
其中每一行的格式是:
ts id
表示在 ts 时刻编号 id 的帖子收到一个”赞”。
现在小明想统计有哪些帖子曾经是”热帖”。
如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。
具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是”热帖”。
给定日志,请你帮助小明统计出所有曾是”热帖”的帖子编号。
输入格式
第一行包含三个整数 N,D,K。
以下 N 行每行一条日志,包含两个整数 ts 和 id。
输出格式
按从小到大的顺序输出热帖 id。
每个 id 占一行。
数据范围
1≤K≤N≤10E5,
0≤ts,id≤10E5,
1≤D≤10000
输入样例:
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
输出样例:
1
3
提示:
尺取法
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define x first // 简化操作,用 x 代替 first #define y second // 简化操作,同上 using namespace std; // 不懂的话可以先去查明pair的用法 typedef pair<int, int > PII; // 简化操作 const int N = 100010; PII a[N]; // 另数组的每个元素都拥有两个属性 int cnt[N]; // 记录某一合法时间段,id出现的数量 bool st[N]; // 记录某一合法时间段,id是否曾是热帖 int main() { int n, d, k; cin >> n >> d >> k; // ts时刻 日志id for (int i = 0; i < n; i ++) scanf("%d%d", &a[i].x, &a[i].y); sort(a, a + n); // 按照时间排序 for (int i = 0, j = 0; i < n; i ++)//以每个10分钟作为一个区间;在区间内找合法热帖 { // 在合法时间段内,id的记录加一 cnt[a[i].y] ++; // 超出合法时间 while(a[i].x - a[j].x >= d) { // 起始时间的id的记录减一 cnt[a[j].y] --; // 指针后移一位 j ++; } //记录某个id曾是热帖 if(cnt[a[i].y] >= k) st[a[i].y] = true; } for (int i = 0; i < N; i ++) if(st[i]) printf("%d\n", i); }