刚参加完 NOIP2017 普及,只考了 210,于是心生不爽,写下了这篇解题报告。。。(逃
第一次写博,望 dalao 们多多指导啊(膜
第一题 score,学完 helloworld 的人也应该都会吧,之前好多人 0 分或 60 分据说是精度炸了,后面不是又重测了么 233
直接给代码
- #include <stdio.h>
- int a,b,c;
- double a1,b1,c1;
- int main()
- {
- scanf("%d %d %d",&a,&b,&c);
- a1=a*0.2;
- b1=b*0.3;
- c1=c*0.5;
- printf("%.lf",a1+b1+c1);
- return 0;
- }
许多人不会像我这么写而是除以 10 再去乘,毕竟都是是的整数倍第二题 librarian,这道题简单分析就考了个排序 + 取余,没什么技术含量,可是由于这个万恶的单词,有个原本 265 的大佬没拼对然后就 gg 到 165,身边还有一个 dalao 第三题写了好多却只有十五分,然后第二题多打了个 0 然后内存就炸了。。。还有某位 - 1 没有打 \ n。。。(同情
也是直接给代码吧
- #include < stdio.h > #include < algorithm > #include < iostream > using namespace std;
- int a[1005];
- int main() {
- int n,
- q,
- b,
- c,
- i,
- j,
- s = 1,
- ss = 0;
- scanf("%d%d", &n, &q);
- for (i = 0; i < n; i++) scanf("%d", &a[i]);
- sort(a, a + n);
- for (i = 0; i < q; i++) {
- scanf("%d %d", &b, &c);
- s = 1;
- ss = 0;
- for (j = 1; j <= b; j++) s = s * 10;
- for (j = 0; j < n; j++) {
- if (a[j] % s == c) {
- printf("%d\n", a[j]);
- ss = 1;
- break;
- }
- }
- if (ss == 0) printf("-1\n");
- }
- return 0;
- }
第三题... 先给题目吧
这道题当我看题目时感觉挺简单的,只是觉得是一个普通的 dfs + 剪枝,可是当真正写的时候就不知道从何写,如何剪枝,然后调试了 1 小时。。。未果,注释矣。。。
之后,我写了一个单纯的 dfs,纯搜,然后水了 65 分,代码如下
第四题说实话没怎么看懂...
- #include < stdio.h > int m,
- n,
- i,
- sign = false,
- a[1001][1001],
- x,
- y,
- color;
- long long ans = 23333333333333;
- void dfs(int x1, int y1, int magic, int money, int w_i_c) //w_i_c=What is the color?
- {
- if (x1 == m && y1 == m) {
- if (money < ans) ans = money;
- return;
- } else {
- if (!magic) //当未施展魔法时
- {
- if (x1 + 1 <= m) //判边界条件
- {
- if (a[x1 + 1][y1] > 0) //当有颜色时
- {
- if (a[x1][y1] == a[x1 + 1][y1]) dfs(x1 + 1, y1, 0, money, -1);
- if (a[x1][y1] != a[x1 + 1][y1]) dfs(x1 + 1, y1, 0, money + 1, -1);
- } //只需考虑颜色的变换
- else if (a[x1 + 1][y1] == 0) dfs(x1 + 1, y1, 1, money + 2, a[x1][y1]);
- }
- if (y1 + 1 <= m) {
- if (a[x1][y1 + 1] > 0) {
- if (a[x1][y1] == a[x1][y1 + 1]) dfs(x1, y1 + 1, 0, money, -1);
- if (a[x1][y1] != a[x1][y1 + 1]) dfs(x1, y1 + 1, 0, money + 1, -1);
- }
- if (a[x1][y1 + 1] == 0) dfs(x1, y1 + 1, 1, money + 2, a[x1][y1]); //颜色就为上一个的颜色
- } //同上
- } else //当施展过魔法
- {
- if (a[x1 + 1][y1] != 0) {
- if (a[x1 + 1][y1] == w_i_c) dfs(x1 + 1, y1, 0, money, -1);
- if (a[x1 + 1][y1] != w_i_c) dfs(x1 + 1, y1, 0, money + 1, -1);
- }
- if (a[x1][y1 + 1] != 0) {
- if (a[x1][y1 + 1] == w_i_c) dfs(x1, y1 + 1, 0, money, -1);
- if (a[x1][y1 + 1] != w_i_c) dfs(x1, y1 + 1, 0, money + 1, -1);
- }
- }
- }
- }
- int main() {
- scanf("%d %d", &m, &n);
- for (int i = 1; i <= n; i++) {
- scanf("%d %d %d", &x, &y, &color);
- a[x][y] = color + 1; //其余为0表示无色,+1保证非负性
- }
- dfs(1, 1, 0, 0, -1); //分别代表横坐标,纵坐标,是否施展♂过魔♂法,钱,颜色;-1是一个特殊值
- if (ans == 23333333333333) printf("-1"); //如果达到这个值就代表ans没有改变,说明到不了终点
- else printf("%d", ans);
- return 0;
- }
粘上一个小学生 20 分的代码吧。。。
今天就到这里,以后我会多多写博,把自己的意见与大家分享,有不解或志同道合者可以加 qq:2396389683,再见
- #include < stdio.h > int sco[500001] = {
- 0
- },
- dis[500001] = {
- 0
- };
- int main() {
- int i,
- j,
- k,
- n,
- d,
- ans = 0,
- flag,
- start;
- scanf("%d%d%d", &n, &d, &k);
- for (i = 1; i <= n; i++) {
- scanf("%d%d", &dis[i], &sco[i]);
- }
- int sum = 0;
- for (i = 1; i <= n; i++) {
- if (sco[i] > 0) {
- sum += sco[i];
- }
- }
- if (sum < k) {
- printf("-1");
- return 0;
- }
- flag = 1;
- while (1) {
- sum = 0;
- start = 0;
- ans++;
- if (ans < d) {
- for (i = 1; i <= n; i++) {
- if (sco[i] > 0 && dis[i] - start >= d - ans && dis[i] - start <= d + ans) {
- sum += sco[i];
- start = dis[i];
- if (sum >= k) {
- printf("%d", ans);
- return 0;
- }
- }
- }
- } else {
- for (i = 1; i <= n; i++) {
- if (sco[i] > 0 && dis[i] - start >= 1 && dis[i] - start <= d + ans) {
- sum += sco[i];
- start = dis[i];
- if (sum >= k) {
- printf("%d", ans);
- return 0;
- }
- }
- }
- }
- }
- }
来源: http://www.cnblogs.com/noipzylfromxj/p/NOIP2017puji.html