原题地址:https://www.jisuanke.com/contest/1857?view=challenges&tdsourcetag=s_pcqq_aiomsg
PS:AC代码AC自CSUOJ,在计蒜客上有些题可能会有点格式问题

文章目录

  • A. Potato Sacks
  • C .Hedwig's Ladder
  • E.What time is it anyway?
  • G.The Erdös-Straus Conjecture
  • H.Subprime Fibonacci Sequence

A. Potato Sacks

题意:给出一个背包的大小,然后给出n个物品,问你能否用这k个物品装满背包.
思路:签到题,01背包。


#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int T;
int a[maxn];
int dp[20][200];
int main() {scanf("%d", &T);while (T--) {CLR(dp, 0);int id;scanf("%d", &id);int w;scanf("%d", &w);for (int i = 1; i <= 10; i++) {scanf("%d", &a[i]);}for (int i = 1; i <= 10; i++) {for (int j = a[i]; j <= w; j++) {dp[i][j] = max(dp[i-1][j], dp[i - 1][j - a[i]] + a[i]);}}printf("%d ", id);if (dp[10][w] == w) printf("YES\n");else printf("NO\n");}return 0;
}/**********************************************************************Problem: 2270User: yiqzqLanguage: C++Result: ACTime:4 msMemory:2428 kb
**********************************************************************/

C .Hedwig’s Ladder

题意:给你一个如题目描述的图,然后给出你可以走的步数,每次你从左上角出发,要求同一个点之只能经过一次,问你有几种走法。
思路:暴力打表题,然后找规律。
我们对当前的图进行建图,然后跑dfs记录数据即可。
最后可以发现,结果类似与一个斐波那契数列,只不过奇数位要再加个1。

#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 10007;
struct node {int v, nxt;
} e[maxn];
int head[maxn], tot;
void add_edge(int u, int v) {e[tot].v = v;e[tot].nxt = head[u];head[u] = tot++;e[tot].v = u;e[tot].nxt = head[v];head[v] = tot++;
}
int ans = 0;
int vis[maxn];
void dfs(int u, int num) {if (num == 0) {ans++;return;}vis[u] = 1;for (int i = head[u]; ~i; i = e[i].nxt) {int v = e[i].v;if (vis[v]) continue;vis[v] = 1;dfs(v, num - 1);vis[v] = 0;}
}
ll fac[maxn];
int main() {//    int MAX = 40;
//    CLR(head, -1);
//    for (int i = 1; i <= MAX - 1; i++) {//        add_edge(i, i + 1);
//    }
//    for (int i = MAX + 1; i <= 2 * MAX - 1; i++) {//        add_edge(i, i + 1);
//    }
//    for (int i = 1; i <= MAX; i++) {//        add_edge(i, i + MAX);
//    }
//    for (int i = 1; i <= 30; i++) {//        ans = 0;
//        CLR(vis, 0);
//        dfs(1, i);
//        printf("i=%d %d\n", i, ans);
//    }fac[1] = 2;fac[2] = 3;for (int i = 3; i <= 1004; i++) {fac[i] = fac[i - 1] + fac[i - 2];if (i % 2) fac[i]++;fac[i] %= mod;}int T;scanf("%d", &T);while (T--) {int id;scanf("%d", &id);int x;scanf("%d", &x);printf("%d %lld\n", id, fac[x]);}return 0;
}/**********************************************************************Problem: 2272User: yiqzqLanguage: C++Result: ACTime:0 msMemory:4368 kb
**********************************************************************/

E.What time is it anyway?

题意:有n个时钟,还有n个时差,现在你需要确定一个具体时间,满足n个时钟每个都对应着一个时差。
思路:模拟题,难点在于对时间加法的写法。
PS :要注意时钟的的进位,且正确时间要用set去存,因为可能存在有多种答案,但是答案都是一样的情况。

#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 100;
const int mod = 1e9 + 7;
int T, id, n;struct node {int h, m, flag;//flag判断是一个时差是一个正数还是负数node() {h = 0, m = 0;}node(int h, int m): h(h), m(m) {}node(int h, int m, int flag): h(h), m(m), flag(flag) {}bool operator < (const node &a)const {return h < a.h || (h == a.h && m < a.m);}node operator + (const node &a)const {//+右边是时差node exa;if (a.flag)exa.h = h + a.h;else exa.h = h - a.h;if (a.flag)exa.m = m + a.m;else exa.m = m - a.m;if (exa.m >= 60) {exa.m -= 60;exa.h++;} else if (exa.m < 0) {exa.m += 60;exa.h--;}if (exa.h > 12)exa.h -= 12;else if (exa.h < 1) exa.h += 12;return exa;}node operator - (const node &a)const {//+右边是时差node exa;if (a.flag)exa.h = h - a.h;else exa.h = h + a.h;if (a.flag)exa.m = m - a.m;else exa.m = m + a.m;if (exa.m >= 60) {exa.m -= 60;exa.h++;} else if (exa.m < 0) {exa.m += 60;exa.h--;}if (exa.h > 12)exa.h -= 12;else if (exa.h < 1) exa.h += 12;return exa;}
} tim[maxn], lag[maxn], correct, ans;
map<node, int>mp;
int cnt = 0;
set<node>S;
void init() {//初始化时钟mp.clear();for (int i = 1; i <= n; i++) {mp[tim[i]]++;}
}
void check(node correct) {//判断当前时间是否可行解for (int i = 2; i <= n; i++) {node t = correct - lag[i];if (mp[t]) mp[t]--;} else return ;}ans = correct;S.insert(correct);
}
int main() {scanf("%d", &T);while (T--) {S.clear();CLR(lag, 0);CLR(tim, 0);scanf("%d%d", &id, &n);for (int i = 1; i <= n; i++) {scanf("%d:%d", &tim[i].h, &tim[i].m);}for (int i = 1; i <= n; i++) {char a[20];char flag;scanf("%s", a + 1);sscanf(a + 1, "%c%d:%d", &flag, &lag[i].h, &lag[i].m);lag[i].h %= 12;if (flag == '+') lag[i].flag = 0;//要和题目数据改成反的else lag[i].flag = 1;}cnt = 0;for (int i = 1; i <= n; i++) {//枚举n种正确解释init();correct = tim[i] + lag[1];mp[tim[i]]--;check(correct);}printf("%d ", id);int cnt = S.size();if (cnt == 1) {printf("%d:%02d\n", ans.h, ans.m);} else if (cnt >= 2) printf("%d\n", cnt);else printf("none\n");}return 0;
}

G.The Erdös-Straus Conjecture

题意:给出一个 n n n,满足式子 4 n = 1 a + 1 b + 1 c \frac{4}{n}=\frac{1}{a}+\frac{1}{b}+\frac{1}{c} n4​=a1​+b1​+c1​,求满足条件的 a , b , c a,b,c a,b,c,且 a , b , c a,b,c a,b,c的字典序是要最小的。
思路:
通过暴力打表前几项,我们发现 a a a的值都是 n / 4 + 1 n/4+1 n/4+1,所以猜测a的值是 n / 4 + 1 n/4+1 n/4+1,(PS:但是不解的是 a a a的范围应该是 [ n / 4 + 1 , n / 4 + 3 ] [n/4+1,n/4+3] [n/4+1,n/4+3], 然后假设我们已知了正确的 a a a,(令 x y = 4 n − 1 a \frac{x}{y}=\frac{4}{n}-\frac{1}{a} yx​=n4​−a1​)那么又因为 a , b , c a,b,c a,b,c是按照字典序排序的,所以显然 b b b的范围是 [ y x + 1 , 2 y x ] [\frac{y}{x}+1,\frac{2y}{x}] [xy​+1,x2y​](取两个极端, 1 b = 1 c \frac{1}{b}=\frac{1}{c} b1​=c1​或者 1 c = 0 \frac{1}{c}=0 c1​=0),最后 c c c的值就由验算得来。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#define fuck(x) cout<<#x<<" = "<<x<<endl;
#define ls (t<<1)
#define rs ((t<<1)+1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 100086;
const int inf = 2.1e9;
const ll Inf = 999999999999999999;
const int mod = 1000000007;
const double eps = 1e-6;
const double pi = acos(-1);ll cal(ll n, ll b, ll x, ll y) {ll y1 = b * y;ll x1 = x * b - y;if (x1 == 0) {return -1;}if (y1 % x1 == 0) {return y1 / x1;} else return -1;
}int main() {int T;scanf("%d", &T);while (T--) {int id;scanf("%d", &id);ll n;scanf("%lld", &n);int flag = 0;for (ll a = n / 4 + 1; a <= n / 4 + 3; a++) {ll x = 4 * a - n;ll y = a * n;for (ll i = y / x + 1 ; i <= 2 * y / x; i++) {ll t = cal(n, i, x, y);if (t > 0) {printf("%d %lld %lld %lld\n",id, a, i, t);flag = 1;break;}}if (flag) break;}}return 0;
}

H.Subprime Fibonacci Sequence

题意:定义一种新的运算 S P ( x ) , SP(x), SP(x),当 x x x为质数或者 1 1 1的时候,返回 x x x,否则返回 p x \frac{p}{x} xp​( p p p是最小的能被 x x x整除的质数)。然后定义 a n = S P ( a n − 1 + a n − 2 ) a_n=SP(a_{n-1}+a_{n-2}) an​=SP(an−1​+an−2​)。
然后给出一组任意的 a 0 a_0 a0​和 a 1 a_1 a1​,让你输出是否存在循环节,如果存在,输出循环节位置和循环节长度,并输出循环节。
思路:先打出质数表。然后由于n的范围只有1000,所以我们可以暴力算出a数组。然后由于这个a数组的每一个值只与前两个有关,因此只要有两个数字连续重复,那就肯定会出现循环节了。所以我们可以利用map存取两个数字的复合值,对于遍历到的每一个数,查询map中是否出现过这个数字。然后记录长度和起始位置就行了。

#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int noprime[maxn * 10], pcnt, p[maxn * 10]; //p存的是质数
void getprime(int N) {pcnt = 0;memset(noprime, 0, sizeof(noprime));//0表示是质数noprime[0] = noprime[1] = 1;for (int i = 2; i < N; ++i) {if (!noprime[i]) {p[pcnt++] = i;//p是存的所有质数}for (int j = 0; j < pcnt && i * p[j] < N; ++j) {noprime[i * p[j]] = 1;if (i % p[j] == 0)break;}}
}
int SP(int x) {if (x == 1 || noprime[x] == 0) return x;for (int i = 0; i < pcnt; i++) {if (x % p[i] == 0) return x / p[i];}
}
int a[maxn];
int T, id, n;
map<int, int>mp;
int main() {getprime(maxn);scanf("%d", &T);while (T--) {mp.clear();int len = -1, index = -1;scanf("%d%d", &id, &n);scanf("%d%d", &a[1], &a[2]);printf("%d", id);for (int i = 3; i <= 3000; i++) {a[i] = SP(a[i - 1] + a[i - 2]);}for (int i = 1; i <= n - 1; i++) {int num = a[i] * 1000000 + a[i + 1];if (mp[num]) {index = i;len = i - mp[num];break;}mp[num] = i;}if (index != -1) {printf(" %d %d\n", index, len);for (int i = index, j = 1; i <= len + index + 1; i++, j++) {printf("%d", a[i]);if (j % 20 == 0 || i == len + index + 1) printf("\n");else printf(" ");}} else {printf(" %d 0\n%d\n", n, a[n + 1]);}}return 0;
}
/**********************************************************************Problem: 2277User: yiqzqLanguage: C++Result: ACTime:140 msMemory:10232 kb
**********************************************************************/

2018 ICPC Greater New York Regional Contest部分题解相关推荐

  1. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest (大部分题解)

    2017-2018 ACM-ICPC, Asia Daejeon Regional Contest ECFINAL PK赛. C 签到题. DAG上的dp. D 签到题. 根据数据范围可知暴力即可. ...

  2. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest 部分题解ABFHJLN

    2020-10-10为了准备CCPC,师兄下午拉了场ICPC练习让我们模拟,负责读题的菜鸡晚上回来重新做了模拟场上有思路的题QAQ 文章目录 A - Berstagram B - The Feast ...

  3. 点分治问题 ----------- 2019-2020 ICPC Asia Hong Kong Regional Contest C.Constructing Ranches[点分治+树状数组]

    题目链接 题目大意: 给你一个nnn个顶点的树,树上的顶点都有一个自己的权值,现在问你有多少对(u,v)(u,v)(u,v),它们路径上点的权值集合可以组成一个多边形? 解题思路: 1.对于树上路径问 ...

  4. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)A ASCII Area

    A: 给你一个矩阵求'/' 和 '\' 围成的图形,简单签到题,有一些细节要考虑. 题解:一行一行的跑,遇到'/'和'\' 就加0.5, 在面积里面的'.' 就加1.用一个flag来判断是否在围住的图 ...

  5. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)G GCD Guessing Game

    G: 要你去才Paul的年龄,Paul的年龄在1~n之间,你每猜一个Paul会告诉你,你猜的这个数和他年龄的gcd,问在最坏情况下最少要猜多少次. 题解: 什么是最坏情况,我们直到如果他的年龄是1的话 ...

  6. ICPC 2019-2020 North-Western Russia Regional Contest 补题部分

    已做A.M,E和H思路已经有了没调AC 已补BEJH 最终已完成ABEJHM B - Bad Treap 大佬题解 感觉这题就很玄学... #define IO ios::sync_with_stdi ...

  7. 2019-2020 ICPC Asia Hong Kong Regional Contest 补题(部分)

    codeforces原题链接 大佬题解 B - Binary Tree 每个人每次一定拿走奇数(2k−12^k-12k−1)个节点,如果先手必胜不难发现两人轮流拿最终一定拿奇数次(每次奇数个节点)说明 ...

  8. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)B Binary Encoding

    B: 现在有一种新的2进制表示法,要你求出0~m-1的每个数的表示. 规则如下:n 是满足 m<=2n 最小数. 而0~m-1的数只能够用n-1个位和n个位来表示. 对于n个位表示的数来说不能有 ...

  9. ICPC North Western European Regional Contest 2019 E. Expeditious Cubing(浮点数处理)

    题目链接 思路:先将前四次时间按照升序排序. 后三次时间的和如果小于给出的标准3,那么就inf,如果前三次的和大于标准时间 3那么就impossible,第三种情况就是,用标准时间 * 3 - 第二长 ...

  10. 2019-2020 ICPC Asia Hong Kong Regional Contest

    EASY: B. Binary Tree 给定一棵树,双方轮流玩游戏,每次可以移除一棵完全二叉树子树.问最后谁会赢.因为完全二叉树一定是奇数,所以直接判断奇偶性即可. void solve(){n=r ...

最新文章

  1. 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
  2. LoRDEC 利用二代数据纠错PacBio 数据( lordec-src_0.9.tar.bz2)
  3. 启示—地点IT高管20在职场心脏经(读书笔记6)
  4. Flink SQL 功能解密系列 —— 解决热点问题的大杀器MiniBatch
  5. javascript-Global与Math对象
  6. 创业互联网公司如何搭建自己的技术架构
  7. Python字符串格式化f-string格式
  8. Searchsploit
  9. 编写一个脚本,用它来操纵QTP的运行
  10. vista系统服务器,Vista系统中怎么设置IIS服务器
  11. 计算两日期之间差多少天----日期格式为:yyyy-mm-dd
  12. tomcat处理html流程,Tomcat 简单配置使用,基本工作原理(流程图)
  13. 关于redis内存分析,内存优化
  14. iOS 处理图片的一些小 Tip
  15. 深入浅出MFC第一章笔记
  16. 洛谷P1724 东风谷早苗
  17. SiT3808:1 -80MHz 单端压控振荡器VCXO
  18. 一个IT小菜鸟的成长之路
  19. 辗转相除法(欧几里得算法)
  20. Java读取数据库Geometry

热门文章

  1. C#学习记录——集合:使用集合
  2. 职场小白 写好的代码发布到服务器
  3. web ③:Write web pages in HTML (Review)
  4. 新基建环境下智能建造技术持续发展
  5. 这样设计问卷才能收集到高质量的数据
  6. 人物行走在柏林噪声地图
  7. setOnItemClickListener不起作用解决方法
  8. 国家精品课程(地理信息系统专业绝对收藏)
  9. 国防科技大学计算机考研试题,国防科技大学历年操作系统考研试题
  10. 在控制台输入操作的简易图书管理系统