A 机器人

链接:https://www.cometoj.com/contest/7/problem/A?problem_id=92

思路:

分两大类讨论:

1. B区没有点:

(1)点都在起点左边

(2)点都在起点右边

(3)起点两边都有点

2.B区有点:

(1)两个区的点都在起点左边

(2)两个区的点都在起点右边

(3)起点两边都有点

分类讨论下就好了,注意一个特殊情况当只经过一个点且这个点正好是起点的情况是输出0

实现代码;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M = 1e6+;
  4. vector<int>g[];
  5. const int inf = 0x3f3f3f3f;
  6. int p[M];
  7. int main()
  8. {
  9. int n,r,m,k,s,x,y;
  10. cin>>n>>r>>m>>k>>s;
  11. for(int i = ;i <= r;i ++){
  12. cin>>x>>y;
  13. g[y].push_back(x);
  14. }
  15. for(int i = ;i < m;i ++) cin>>p[i];
  16. p[m] = ; p[m+] = n; m += ;
  17. sort(g[].begin(),g[].end());
  18. sort(g[].begin(),g[].end());
  19. sort(p,p+m);
  20. int len1 = g[].size(),len2 = g[].size();
  21. int l1,l2,r1,r2,ans=;
  22. l1 = l2 = inf; r1 = r2 = ;
  23. if(g[].size()){
  24. int a1 = lower_bound(p,p+m,g[][len1-])-p;
  25. int b1 = upper_bound(p,p+m,g[][])-p-;
  26. l1 = p[b1]; r1 = p[a1];
  27. }
  28. if(g[].size()==){
  29. if(g[].size()==&&g[][]==s) ans = ;
  30. else {
  31. if(g[][] >= s) ans = abs(r1-s)*;
  32. else if(g[][len1-] <= s) ans = abs(l1-s)*;
  33. else ans = *(abs(r1-s)+abs(l1-s));
  34. }
  35. }
  36. else{
  37. int a = lower_bound(p,p+m,g[][len2-])-p;
  38. int b = upper_bound(p,p+m,g[][])-p-;
  39. l2 = p[b]; r2 = p[a];
  40. int l = min(l1,l2),rr = max(r1,r2);
  41. if(l >= s) ans = *k + *abs(rr-s);
  42. else if(rr <= s) ans = *k + *abs(l-s);
  43. else ans = *k+*(abs(l-s)+abs(rr-s));
  44. }
  45. cout<<ans<<endl;
  46. }

B 吃豆豆

题目链接:https://www.cometoj.com/contest/7/problem/B?problem_id=93

  1. 思路;
    构造一个三维数组dp[i][j][k] , 代表在格子i,j上第k秒最多有多少个糖果
    维护起来就取前一个状态的五种可能性 dp[i+1][j][k-1] dp[i-1][j][k-1] dp[i][j+1][k-1] dp[i][j-1][k-1] dp[i][j][k-1] 中最大的就好了
  2.  
  3. 实现代码;
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int M = 2e4 +;
  5. int dp[][][M];
  6. int t[][];
  7. int main()
  8. {
  9. int n,m,c,sx,sy,ex,ey;
  10. cin>>n>>m>>c;
  11. for(int i = ;i <= n;i ++)
  12. for(int j = ;j <= m;j ++)
  13. cin>>t[i][j];
  14. cin>>sx>>sy>>ex>>ey;
  15. memset(dp,-M,sizeof(dp));
  16. dp[sx][sy][] = ;
  17. for(int k = ;k < M;k ++){
  18. for(int i = ;i <= n;i ++){
  19. for(int j = ;j <= m;j ++){
  20. dp[i][j][k] = max(dp[i-][j][k-],max(dp[i+][j][k-],max(dp[i][j+][k-],max(dp[i][j-][k-],dp[i][j][k-]))));
  21. if(k%t[i][j]==) dp[i][j][k]++;
  22. }
  23. }
  24. }
  25. int ans = ;
  26. for(int i = ;i < M;i ++){
  27. if(dp[ex][ey][i] >= c){
  28. ans = i;
  29. break;
  30. }
  31. }
  32. cout<<ans<<endl;
  33. }

C 拆拆拆数

题目链接:https://www.cometoj.com/contest/7/problem/C?problem_id=94

思路:相邻的两个数互质,暴力找就好了

实现代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. int main()
  5. {
  6. ll a,b,n;
  7. cin>>n;
  8. for(ll i = ;i <= n;i ++){
  9. cin>>a>>b;
  10. if(__gcd(a,b)==){
  11. cout<<<<endl;
  12. cout<<a<<" "<<b<<endl;
  13. }
  14. else {
  15. ll flag = ;
  16. for(ll i = ;i <= ;i ++){
  17. for(ll j = ;j <= ;j ++){
  18. if(__gcd(a-i,b-j)==&&__gcd(i,j)==){
  19. cout<<<<endl;
  20. cout<<i<<" "<<j<<endl;
  21. cout<<a-i<<" "<<b-j<<endl;
  22. flag = ;
  23. break;
  24. }
  25. }
  26. if(flag == ) break;
  27. }
  28. }
  29. }
  30. return ;
  31. }

E 流流流动

题目链接:https://www.cometoj.com/contest/7/problem/E?problem_id=106

思路:

树形dp,按照题目要求把数连起来,会形成一棵棵树,对于这个树按照题目要求我们可以得到以下状态转移方程:

dp[u][0] += max(dp[v][0],dp[v][1]);
dp[u][1] += max(dp[v][0],dp[v][1]-d[min(u,v)]);

dp[i][j]   j==1代表取了u这个点,j==0代表没取

连边的话,直接用并查集就好了

实现代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int M = 1e3+;
  5. struct node{
  6. int next,to;
  7. }e[M];
  8. ll dp[M][],pre[M],f[M],d[M],cnt,head[M];
  9. void add(ll u,ll v){
  10. e[++cnt].to = v;e[cnt].next = head[u];head[u] = cnt;
  11. e[++cnt].to = u;e[cnt].next = head[v];head[v] = cnt;
  12. }
  13. int Find(int x){
  14. if(x == pre[x]) return x;
  15. return pre[x] = Find(pre[x]);
  16. }
  17. void Union(int x,int y){
  18. int fx = Find(x);
  19. int fy = Find(y);
  20. pre[fx] = fy;
  21. }
  22. void dfs(int u,int fa){
  23. dp[u][] = f[u];dp[u][]=;
  24. for(int i = head[u];i;i=e[i].next){
  25. int v = e[i].to;
  26. if(v == fa) continue;
  27. dfs(v,u);
  28. dp[u][] += max(dp[v][],dp[v][]);
  29. dp[u][] += max(dp[v][],dp[v][]-d[min(u,v)]);
  30. }
  31. }
  32.  
  33. int main()
  34. {
  35. ios::sync_with_stdio();
  36. cin.tie(); cout.tie();
  37. int n;
  38. cin>>n;
  39. for(int i = ;i <= n;i ++) cin>>f[i],pre[i] = i;
  40. for(int i = ;i <= n;i ++) cin>>d[i];
  41. for(int i = ;i <= n;i ++){
  42. if((i%==)&&(i*+<=n)){
  43. add(i*+,i);
  44. Union(i*+,i);
  45. }
  46. else if(i%==){
  47. add(i/,i);
  48. Union(i/,i);
  49. }
  50. }
  51. ll ans = ;
  52. for(int i = ;i <= n;i ++){
  53. if(pre[i]==i){
  54. dfs(i,i);
  55. ans += max(dp[i][],dp[i][]);
  56. }
  57. }
  58. cout<<ans<<endl;
  59. }

F 爬爬爬山

题目链接:https://www.cometoj.com/contest/7/problem/F?problem_id=97

思路:基础最短路,只要加个判断就好了

实现代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. typedef pair<ll,ll> P;
  5. const int M = 2e5+;
  6. const ll inf = 1e18;
  7. ll vis[M],dist[M],n,m,k,tot,a[M];
  8. struct node{
  9. node(ll t,ll c):to(t),cost(c){}
  10. ll to;
  11. ll cost;
  12. };
  13. vector<node>g[M];
  14. priority_queue<P,vector<P>,greater<P> > que;
  15. void add(ll u,ll v,ll c){
  16. g[u].push_back(node(v,c));
  17. g[v].push_back(node(u,c));
  18. }
  19. void dij(){
  20. for(ll i = ;i <= n; i ++){
  21. dist[i] = inf;
  22. }
  23. dist[] = ;
  24. que.push(P(,));
  25. while(!que.empty()){
  26. P p = que.top();
  27. que.pop();
  28. ll v = p.second;
  29. if(dist[v] < p.first) continue;
  30. for(ll i = ;i < g[v].size();i ++){
  31. node e = g[v][i];
  32. ll cnt = ;
  33. //cout<<e.to<<" "<<a[e.to]<<endl;
  34. if(a[e.to] > k) cnt = (a[e.to]-k)*(a[e.to]-k);
  35. if(dist[e.to] > dist[v]+e.cost+cnt){
  36. dist[e.to] = dist[v] + e.cost + cnt;
  37. que.push(P(dist[e.to],e.to));
  38. }
  39. }
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. ios::sync_with_stdio();
  46. cin.tie(); cout.tie();
  47. ll x,y,z;
  48. cin>>n>>m>>k;
  49. for(ll i = ;i <= n;i ++)
  50. g[i].clear();
  51. for(ll i = ;i <= n;i ++){
  52. cin>>a[i];
  53. }
  54. k+=a[];
  55. for(ll i = ;i <= m;i ++){
  56. cin>>x>>y>>z;
  57. add(x,y,z);
  58. }
  59. dij();
  60. cout<<dist[n]<<endl;
  61. }

I 起起落落

题目链接:https://www.cometoj.com/contest/7/problem/I?problem_id=100

思路:

把符合要求的序列的大小关系列一下会发现序列是会形成连续山峰状的,最简化的关系也就是 : a[i] > a[i+2] > a[i+1],符合序列可以为:(3,1,2) 因为i为偶数变大一点关系会成为: a[i] > a[i+2] > a[i+1] > a[i+4] > a[i+3] 符合序列可以为:(5,3 ,4,2,1),对于原序列,我们只要找到符合a[i] > a[i+2] > a[i+1]的三个数就算一个序列,如果这些序列的头尾有相连的,那么就会形成新的序列,我们用dp[i]表示以i结尾的子序列有多少个,然后从i向前遍历如果出现a[j] < a[i],那么j点可以作为三个点的中间点,记录k++,如果a[j] > a[i] 那么这个点可以作为三个点的开头点,可以和k个中间点组合形成k个新序列,如果以j为尾节点的序列数为dp[j],那么之前组成的新序列可以并上之前的序列,形成dp[j]*k个新节点,所以此时状态转移方程为:dp[i] += dp[j]*k + k;

实现代码;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int mod = 1e9+;
  5. const int M = 2e3+;
  6. ll dp[M],a[M];
  7. int main()
  8. {
  9. int n;
  10. ll ans = ;
  11. cin>>n;
  12. for(int i = ;i <= n;i ++){
  13. cin>>a[i];
  14. }
  15. for(int i = ;i <= n;i ++){
  16. ll k = ;
  17. for(int j = i-;j >= ;j --){
  18. if(a[j] < a[i]) k++;
  19. else if(a[j] > a[i]) dp[i] = (dp[i]+(dp[j]+)*k)%mod;
  20. }
  21. ans = (ans + dp[i])%mod;
  22. }
  23. cout<<ans<<endl;
  24. }

J 夺宝奇兵

  1. 题目链接:https://www.cometoj.com/contest/7/problem/J?problem_id=101
  2.  
  3. 思路:枚举最终获得的物品的数量k,遍历一遍所有居民如果居民的物品数量x大于等于k那么买下该居民最便宜的x-k+1件物品,所有居民都买完后如果买到的物品小于预期值k
    那么就从剩下的所有物品中挑选最便宜的几件填进去。
  4.  
  5. 之前好像在51nod上写扫描线专题的时候写到过基本一样的题。。。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const ll M = 1e3 + ;
  5. vector<ll>g[M];
  6. const ll inf = 1e18;
  7. ll vis[M],f[M],p[M];
  8.  
  9. bool cmp1(ll x,ll y){
  10. return p[x] < p[y];
  11. }
  12. int main(){
  13. ll n,m,to;
  14. ll mx=inf;
  15. cin>>n>>m;
  16. for(ll i = ;i <= m;i ++){
  17. cin>>p[i]>>to;
  18. f[i] = i;
  19. g[to].push_back(i);
  20. }
  21. for(ll i = ;i <= n;i ++)
  22. sort(g[i].begin(),g[i].end(),cmp1);
  23. for(ll i = ;i <= m;i ++){
  24. ll cnt = ;ll ans = ;
  25. memset(vis,,sizeof(vis));
  26. for(ll j = ;j <= n;j ++){
  27. if(g[j].size() >= i){
  28. for(ll k = ;k <= g[j].size()-i;k ++){
  29. ans += p[g[j][k]];
  30. vis[g[j][k]]=; cnt++;
  31. }
  32. }
  33. }
  34. if(cnt < i){
  35. sort(f+,f++m,cmp1);
  36. for(ll j = ;j <= m;j ++){
  37. if(!vis[f[j]]){
  38. ans += p[f[j]]; cnt++;
  39. }
  40. if(cnt == i) break;
  41. }
  42. }
  43. mx = min(mx,ans);
  44. }
  45. cout<<mx<<endl;
  46. }
  47. /*
  48. 1 108
  49. 2 63
  50. 3 45
  51. 4 32
  52. 5 28
  53. 6 33
  54. 7 48
  55. 8 63
  56. 9 78
  57. 10 93
  58. 11 108
  59. */

CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A B C E F I J的更多相关文章

  1. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  2. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  3. CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    Replay Dup4: 要是不挂机,再多仔细想想就好了 J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵? 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道 要发 ...

  4. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) - I 起起落落

    题目描述 无聊的wlswls正在观察某个商品的价格,wlswls一共观察了nn天,每天这个商品都会有一个价格p_ipi​. 定义一个长度为2m+1(3\leq2m+1\leq n)2m+1(3≤2m+ ...

  5. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) 夺宝奇兵

    题目描述 wlswls所在的王国有nn个居民(不包括wlswls),他们共有mm件神奇的宝物. 对于第ii件宝物,wlswls可以花费a_iai​的金币把它从原来的主人那里买过来. 请问wlswls最 ...

  6. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  7. 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)

    题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...

  8. CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...

    Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...

  9. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

随机推荐

  1. Codeblocks 遇到的问题 Cannot open output file, permission denied

    Codeblocks下运行C++的程序时,偶尔会出现  Cannot open output file, permission denied 的问题,导致不能够编译. 在 Stack Overflow ...

  2. 牛客---java练习

    一. 1. abstract可以修饰方法和类,不能修饰属性.抽象方法没有方法体,即没有大括号{}.抽象类中的成员属性都是public static final类型的:成员方法都是public abst ...

  3. MyEclipse和eclipse的区别

    对于新手来说,MyEclipse和eclipse来说的区别可能就是MyEclipse比eclipse多了my,MyEclipse主要为JavaEE开发,而Eclipse主要为Java开发..那么MyE ...

  4. c++入门之引用

    引用通常被用在函数形参传递的过程中.一般的参数传递的过程:将实参进行拷贝,函数中都是对拷贝的变量进行操作,而不是对原变量进行操作.但很多情况下,我们都希望对原变量进行操作.(比如交换两个变量的数值). ...

  5. 15-分析Ajax请求并抓取今日头条街拍美图

    流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...

  6. git在vs2017中的使用

    对于习惯了右键提交源代码的道友来说,敲命令行真的蓝瘦香菇.所幸17里集成了Git插件,用起来还是挺方便的. 1.本地安装git,工具还是要有的,主要用于配置环境,ssh配置一下.就不用每次都去连接了. ...

  7. 后台管理系统之系统操作日志开发(Java实现)

    一,功能点 实现管理员操作数据的记录.效果如下 二,代码实现 基于注解的Aop日志记录 1.Log实体类 package com.ideal.manage.guest.bean.log; import ...

  8. 【学习总结】Git学习-参考廖雪峰老师教程-期末总结

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  9. Redis教程(Windows)

    安装 1)下载redis压缩包并  , 推荐地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平 ...

  10. VUE.JS 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法

    正常情况下在data里面都有做了定义 在函数里面进行赋值 这时候你运行时会发现,数据可以请求到,但是会报错 TypeError: Cannot set property 'listgroup' of ...