ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dashboard - Codeforces Global Round 13 - Codeforces

2022-08-06 12:45:24  阅读:203  来源: 互联网

标签:13 cout int Global cin long Codeforces define


Dashboard - Codeforces Global Round 13 - Codeforces

1.Problem - B - Codeforces

题意:存在n行1e6+2列,然后会有n个障碍物。可以将障碍物水平移动,和垂直移动。都有对应的消费。你需要从起点(1,1)到终点(n,1e6+2).问最少消费多少。

思路:只要存在两个点之间的y距离是大于1的那这条路肯定是通的。那最小值就是0。如果全在一列上,那就是有一个点需要移动两次,那就比较u+v和2*v的最小值。如果是有点错位我只要把他横移或者竖移一下就可以了。那就只要比较u,v最小值就可以了。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
const int N=200;
int n,u,v;
int a[N];
void slove(){
cin>>n>>u>>v;
fel(i,1,n){
cin>>a[i];
}
int cnt=0;
for(int i=2;i<=n;i++){
if(a[i]==a[i-1])cnt++;
else if(abs(a[i]-a[i-1])>1){
cout<<0<<endl;
return;
}
}
if(cnt==n-1){
cout<<min(u+v,v*2)<<endl;
}
else cout<<min(u,v)<<endl;
}
signed main(){
IOS
int t;
cin>>t;
while(t--){
slove();
}
return 0;
}

2.Problem - C - Codeforces

题意:任意选择一个点,下一次跳到s[i]+i,,直到最后跳到n点以外。同时s[i]--;问最少需要选择多少次可以使得所有点都变成1.

思路:考虑用1个b数组来记录1---i-1踩到i点的次数,如果b[i]<a[i]-1,那就还需要选择a[i]作为起点。如果b[i]>a[i]-1那多余的跳到的次数会转移个a[i+1] (因为多余的次数跳到这个点上时此点是1).

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
const int N=5e3+100;
int a[N],b[N],n;
void slove(){
cin>>n;
fel(i,1,n){
cin>>a[i];
b[i]=0;
}
int ans=0;
for(int i=1;i<=n;i++){
int t=b[i];
if(b[i]<a[i]-1){
ans+=a[i]-1-b[i];
t+=a[i]-1-b[i];
}
b[i+1]+=t-a[i]+1;
if(i+2<=n)
for(int j=i+2;j<=min(n,a[i]+i);j++){
b[j]++;
}
}
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
while(t--){
slove();
}
return 0;
}

3.Problem - D - Codeforces

题意:q此询问,输入x,y。如果x可以到y就输出yes。u和u+v之间有边当且仅当u&v=v。

思路:举个列子比如说0111肯定是可以到1000,0111&0001=0001,0111+0001=1000,所以发现u&v==v的同时u+v,这就会导致u的低位一会向高位合并或者移动。所以就考虑只要u的后缀1的个数是小于u+v的就不可能了。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
//发先每一个数如果加上一个数那我的一只能向更高位进,所以后缀1的个数x肯定是大于y的,
//定义f[i,x]是x最1-i位1的个数,想要是x可以变成y,显先必须的满足f[i,x]>=f[i,y];
int x,y;
int sumx[50],sumy[50];
void slove(){
memset(sumx,0,sizeof(sumx));
memset(sumy,0,sizeof(sumy));
cin>>x>>y;
if(x>y){
cout<<"NO"<<endl;
return;
}
for(int i=1;i<=30;i++){
sumx[i]=sumx[i-1];
sumy[i]=sumy[i-1];
if(x&1)sumx[i]++;
if(y&1)sumy[i]++;
x/=2,y/=2;
}
for(int i=1;i<=30;i++){
if(sumx[i]<sumy[i]){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
signed main(){
IOS
int t;
cin>>t;
while(t--){
slove();
}
return 0;
}
 

标签:13,cout,int,Global,cin,long,Codeforces,define
来源: https://www.cnblogs.com/silky----player/p/16556841.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有