A 机器人

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

思路:

分两大类讨论:

1. B区没有点:

(1)点都在起点左边

(2)点都在起点右边

(3)起点两边都有点

2.B区有点:

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

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

(3)起点两边都有点

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

实现代码;

#include<bits/stdc++.h>
using namespace std;
const int M = 1e6+;
vector<int>g[];
const int inf = 0x3f3f3f3f;
int p[M];
int main()
{
int n,r,m,k,s,x,y;
cin>>n>>r>>m>>k>>s;
for(int i = ;i <= r;i ++){
cin>>x>>y;
g[y].push_back(x);
}
for(int i = ;i < m;i ++) cin>>p[i];
p[m] = ; p[m+] = n; m += ;
sort(g[].begin(),g[].end());
sort(g[].begin(),g[].end());
sort(p,p+m);
int len1 = g[].size(),len2 = g[].size();
int l1,l2,r1,r2,ans=;
l1 = l2 = inf; r1 = r2 = ;
if(g[].size()){
int a1 = lower_bound(p,p+m,g[][len1-])-p;
int b1 = upper_bound(p,p+m,g[][])-p-;
l1 = p[b1]; r1 = p[a1];
}
if(g[].size()==){
if(g[].size()==&&g[][]==s) ans = ;
else {
if(g[][] >= s) ans = abs(r1-s)*;
else if(g[][len1-] <= s) ans = abs(l1-s)*;
else ans = *(abs(r1-s)+abs(l1-s));
}
}
else{
int a = lower_bound(p,p+m,g[][len2-])-p;
int b = upper_bound(p,p+m,g[][])-p-;
l2 = p[b]; r2 = p[a];
int l = min(l1,l2),rr = max(r1,r2);
if(l >= s) ans = *k + *abs(rr-s);
else if(rr <= s) ans = *k + *abs(l-s);
else ans = *k+*(abs(l-s)+abs(rr-s));
}
cout<<ans<<endl;
}

B 吃豆豆

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

思路;
构造一个三维数组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] 中最大的就好了 实现代码;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 2e4 +;
int dp[][][M];
int t[][];
int main()
{
int n,m,c,sx,sy,ex,ey;
cin>>n>>m>>c;
for(int i = ;i <= n;i ++)
for(int j = ;j <= m;j ++)
cin>>t[i][j];
cin>>sx>>sy>>ex>>ey;
memset(dp,-M,sizeof(dp));
dp[sx][sy][] = ;
for(int k = ;k < M;k ++){
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
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-]))));
if(k%t[i][j]==) dp[i][j][k]++;
}
}
}
int ans = ;
for(int i = ;i < M;i ++){
if(dp[ex][ey][i] >= c){
ans = i;
break;
}
}
cout<<ans<<endl;
}

C 拆拆拆数

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

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

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll a,b,n;
cin>>n;
for(ll i = ;i <= n;i ++){
cin>>a>>b;
if(__gcd(a,b)==){
cout<<<<endl;
cout<<a<<" "<<b<<endl;
}
else {
ll flag = ;
for(ll i = ;i <= ;i ++){
for(ll j = ;j <= ;j ++){
if(__gcd(a-i,b-j)==&&__gcd(i,j)==){
cout<<<<endl;
cout<<i<<" "<<j<<endl;
cout<<a-i<<" "<<b-j<<endl;
flag = ;
break;
}
}
if(flag == ) break;
}
}
}
return ;
}

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代表没取

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

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e3+;
struct node{
int next,to;
}e[M];
ll dp[M][],pre[M],f[M],d[M],cnt,head[M];
void add(ll u,ll v){
e[++cnt].to = v;e[cnt].next = head[u];head[u] = cnt;
e[++cnt].to = u;e[cnt].next = head[v];head[v] = cnt;
}
int Find(int x){
if(x == pre[x]) return x;
return pre[x] = Find(pre[x]);
}
void Union(int x,int y){
int fx = Find(x);
int fy = Find(y);
pre[fx] = fy;
}
void dfs(int u,int fa){
dp[u][] = f[u];dp[u][]=;
for(int i = head[u];i;i=e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs(v,u);
dp[u][] += max(dp[v][],dp[v][]);
dp[u][] += max(dp[v][],dp[v][]-d[min(u,v)]);
}
} int main()
{
ios::sync_with_stdio();
cin.tie(); cout.tie();
int n;
cin>>n;
for(int i = ;i <= n;i ++) cin>>f[i],pre[i] = i;
for(int i = ;i <= n;i ++) cin>>d[i];
for(int i = ;i <= n;i ++){
if((i%==)&&(i*+<=n)){
add(i*+,i);
Union(i*+,i);
}
else if(i%==){
add(i/,i);
Union(i/,i);
}
}
ll ans = ;
for(int i = ;i <= n;i ++){
if(pre[i]==i){
dfs(i,i);
ans += max(dp[i][],dp[i][]);
}
}
cout<<ans<<endl;
}

F 爬爬爬山

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

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

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<ll,ll> P;
const int M = 2e5+;
const ll inf = 1e18;
ll vis[M],dist[M],n,m,k,tot,a[M];
struct node{
node(ll t,ll c):to(t),cost(c){}
ll to;
ll cost;
};
vector<node>g[M];
priority_queue<P,vector<P>,greater<P> > que;
void add(ll u,ll v,ll c){
g[u].push_back(node(v,c));
g[v].push_back(node(u,c));
}
void dij(){
for(ll i = ;i <= n; i ++){
dist[i] = inf;
}
dist[] = ;
que.push(P(,));
while(!que.empty()){
P p = que.top();
que.pop();
ll v = p.second;
if(dist[v] < p.first) continue;
for(ll i = ;i < g[v].size();i ++){
node e = g[v][i];
ll cnt = ;
//cout<<e.to<<" "<<a[e.to]<<endl;
if(a[e.to] > k) cnt = (a[e.to]-k)*(a[e.to]-k);
if(dist[e.to] > dist[v]+e.cost+cnt){
dist[e.to] = dist[v] + e.cost + cnt;
que.push(P(dist[e.to],e.to));
}
}
}
} int main()
{
ios::sync_with_stdio();
cin.tie(); cout.tie();
ll x,y,z;
cin>>n>>m>>k;
for(ll i = ;i <= n;i ++)
g[i].clear();
for(ll i = ;i <= n;i ++){
cin>>a[i];
}
k+=a[];
for(ll i = ;i <= m;i ++){
cin>>x>>y>>z;
add(x,y,z);
}
dij();
cout<<dist[n]<<endl;
}

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;

实现代码;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9+;
const int M = 2e3+;
ll dp[M],a[M];
int main()
{
int n;
ll ans = ;
cin>>n;
for(int i = ;i <= n;i ++){
cin>>a[i];
}
for(int i = ;i <= n;i ++){
ll k = ;
for(int j = i-;j >= ;j --){
if(a[j] < a[i]) k++;
else if(a[j] > a[i]) dp[i] = (dp[i]+(dp[j]+)*k)%mod;
}
ans = (ans + dp[i])%mod;
}
cout<<ans<<endl;
}

J 夺宝奇兵

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

思路:枚举最终获得的物品的数量k,遍历一遍所有居民如果居民的物品数量x大于等于k那么买下该居民最便宜的x-k+1件物品,所有居民都买完后如果买到的物品小于预期值k,
那么就从剩下的所有物品中挑选最便宜的几件填进去。 之前好像在51nod上写扫描线专题的时候写到过基本一样的题。。。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M = 1e3 + ;
vector<ll>g[M];
const ll inf = 1e18;
ll vis[M],f[M],p[M]; bool cmp1(ll x,ll y){
return p[x] < p[y];
}
int main(){
ll n,m,to;
ll mx=inf;
cin>>n>>m;
for(ll i = ;i <= m;i ++){
cin>>p[i]>>to;
f[i] = i;
g[to].push_back(i);
}
for(ll i = ;i <= n;i ++)
sort(g[i].begin(),g[i].end(),cmp1);
for(ll i = ;i <= m;i ++){
ll cnt = ;ll ans = ;
memset(vis,,sizeof(vis));
for(ll j = ;j <= n;j ++){
if(g[j].size() >= i){
for(ll k = ;k <= g[j].size()-i;k ++){
ans += p[g[j][k]];
vis[g[j][k]]=; cnt++;
}
}
}
if(cnt < i){
sort(f+,f++m,cmp1);
for(ll j = ;j <= m;j ++){
if(!vis[f[j]]){
ans += p[f[j]]; cnt++;
}
if(cnt == i) break;
}
}
mx = min(mx,ans);
}
cout<<mx<<endl;
}
/*
1 108
2 63
3 45
4 32
5 28
6 33
7 48
8 63
9 78
10 93
11 108
*/

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. Atcoder F - LCS (DP-最长公共子序列,输出字符串)

    F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...

  2. Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制

    1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...

  3. html,css学习实践总结

    网页的布局方式 1.什么是网页的布局方式? 网页的布局方式其实就是指浏览器是如何对网页中的元素进行排版的 1.标准流(文档流/普通流)排版方式 1.1其实浏览器默认的排版方式就是标准流的排版方式 1. ...

  4. xmanager 乱码

    xmanager连接后中文显示乱码 - 程序员CC - 博客园http://www.cnblogs.com/aomidata/p/3445075.html Xshell 为什么会出现中文乱码?-Xma ...

  5. 关于微信小程序使用canvas生成图片,内容图片跨域的问题

    最近有个项目是保存为名片(图片),让用户发送给朋友或朋友圈,找了很多方案都不适用,绞尽脑汁之后还是选了使用canvas,但是用这玩意儿生成图片最大的缺点就是,如果你的内容中有图片,并且这个图片是通过外 ...

  6. vue组件内部引入远程js文件

    之所以要做这个是因为,在一个组件内部需要引入一个js文件来定位.如果放在index.html,这样每个组件都会有这个js.所以需要在组件内单独引入. 第一种操作 Dom引入js: export def ...

  7. PHP--高级算法--面试

    数据结构和算法(转载) 原文地址:  https://blog.csdn.net/s1070/article/details/51174725 1.使对象可以像数组一样进行foreach循环,要求属性 ...

  8. C#复习笔记(3)--C#2:解决C#1的问题(泛型)

    这一章会描述在C#2中所做的主要的变化 泛型 泛型的概念中包含类型参数和类型实参,类型参数相当于类型实参的蓝图. 泛型类型分为未绑定泛型类型和已构造泛型类型.已构造泛型类型又分为开放的泛型类型和封闭的 ...

  9. java.util(Date和Calendar)

    public class Date implements java.io.Serializable, Cloneable, Comparable<Date> { public Date() ...

  10. syncthing 多主机同步文件工具

    周五看了下阮一峰的blog 看到有一个 syncthing的小工具挺好用的 进行了简单的尝试: 1. 下载文件位置: https://syncthing.net 2. 下载文件后的简单安装 绿色版直接 ...