NOIP 2017 模拟
11 2
T1:
题目:
——正解思路:
动态规划 / 贪心
——我的乱搞:
tnnd动态规划写炸了,,,,,,,
——tips:
我能怎么办,,手动对拍了几组都没卡bug,,,,,
你们不要老想着搞个大新闻然后把评测姬批判一番。。
该批判的是该死的linux虚拟机,,,简直有毒
满载悲伤的代码:
#pragma GCC optimize("O3")
#include <fstream>
#include <algorithm>
using namespace std;
struct node{
int s, t;
inline friend bool operator < (const node &a, const node &b) {
return a.t < b.t;
}
}a[100001];
inline int read () {
register int i = 0;
register char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) i = i * 10 + (c ^ 48), c = getchar();
return i;
}
int main () {
register int n = read ();
for (register int i = 1; i <= n; i++) a[i] = (node){read() * 60 + read(), read() * 60 + read()};
sort (a + 1, a + 1 + n);
register int end = -1, ans = 0;
for (register int i = 1; i <= n; i++) if(a[i].s >= end) ++ans, end = a[i].t;
printf ("%d\n", ans);
return 0;
}
题目:
这题终于让我明白了什么叫 骗分骗样例,暴力出奇迹,,,像 wyw da lao 低头
——正解思路:
二分
——我的乱搞:
本来是一个很好的暴力,然后前缀和没开 long long ,,,蛤蛤蛤蛤蛤。。。。。
——tips:
数据范围有毒。。。。
然而趁着 zgs 还没有改数据,赶紧 oj 上先交一发暴力,,,
满载悲伤的代码(暴力, 正解懒得打):
#pragma GCC optimize("O3")
#include <fstream>
int n, l, r;
double a[20001];
template <typename T>
inline void read (T &x) {
x = 0;
register char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
}
int main () {
read (n), read (l), read (r);
for (register int i = 1; i <= n; i++) read (a[i]), a[i] += a[i - 1];
register double ans = 0.0;
for (register int p = l, q = std::min (l << 1, r); p <= q; p++)
for (register int i = 1; i + p <= n; i++)
if (a[i + p] - a[i] > ans * p)
ans = (a[i + p] - a[i]) / p;
printf ("%.4f\n", ans);
return 0;
}
T3:
题目:
——正解思路:
动态规划
——我的乱搞:
状态压缩 + 马拉车,,貌似马拉车打炸了耶。。。。。。。
——tips:
我不得不把linux虚拟机批判一番了,,,,今天的代码,两个报 warning, 还 tm disable 不掉,,本是同根生,相煎何太急。。C语言不能坑C语言啊啊啊啊啊啊。。。。
满载悲伤的代码:
为了省空间,我都把 int 改成 char 了:
#pragma GCC optimize("O3")
#include <stdio.h>
#include <string.h>
char s[53], t[53], f[52][52][52][52];
int main () {
scanf ("%s\n%s", s + 1, t + 1);
char l1 = strlen(s + 1), l2 = strlen(t + 1), ans = 0;
for (register char i = 1; i <= l1; ++i)
for (register char j = 1; j <= l2; ++j)
for (register char k = l1; k >= 1; --k)
for (register char l = l2; l >= 1; --l) {
register char x = f[i][j][k][l];
if (i < k and s[i] == s[k] and x + 2 > f[i + 1][j][k - 1][l])
f[i + 1][j][k - 1][l] = x + 2;
if (j < l and t[j] == t[l] and x + 2 > f[i][j + 1][k][l - 1])
f[i][j + 1][k][l - 1] = x + 2;
if (i <= k and j <= l) {
if (s[i] == t[l] and x + 2 > f[i + 1][j][k][l - 1]) f[i + 1][j][k][l - 1] = x + 2;
if (t[j] == s[k] and x + 2 > f[i][j + 1][k - 1][l]) f[i][j + 1][k - 1][l] = x + 2;
}
}
for (register char i = 0; i <= l1 + 1; ++i)
for (register char j = 0; j <= l2 + 1; ++j)
for (register char k = l1; k >= 0; --k)
for (register char l = l2; l >= 0; --l) {
if (i == k and j > l and f[i][j][k][l] + 1 > ans) ans = f[i][j][k][l] + 1;
if (i > k and j == l and f[i][j][k][l] + 1 > ans) ans = f[i][j][k][l] + 1;
if (i > k and j > l and f[i][j][k][l] > ans) ans = f[i][j][k][l];
}
printf ("%d\n", ans);
return 0;
}