Codeforce 963

2024-08-27 20:12
文章标签 codeforce 963

本文主要是介绍Codeforce 963,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CF 963

  • B 模拟加贪心 偶数个数
  • C 模拟+前缀和 灯能否全亮
  • D 二分+DP 中位数尽可能大
  • F1 模拟+镜像

题目链接

B 模拟加贪心 偶数个数

在这里插入图片描述

考点:贪心

思路:除了全是偶数的情况,其他的情况都需要将偶数转换为奇数。最少的操作步数是偶数个数,如果有一步操作执行之前最小的偶数都比最大的奇数大,则操作步数要加1,即最后结果是偶数个数+1.

代码1:

t = int(input())
for _ in range(t):n = int(input())a = list(map(int, input().split()))s = -1v = []for x in a:if x%2 == 0:v.append(x)elif x > s:s = xv.sort()if s == -1 or v == []:print(0)continueans = len(v)for t in v:if t < s:s += telse:ans += 1breakprint(ans)

代码2:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define int long long 
#define x first
#define y secondtypedef long long ll;void solve(){int n;cin>>n;vector<int> odd,even;for(int i=0;i<n;i++){int x;cin>>x;if(x%2==0) even.push_back(x);else odd.push_back(x);}sort(even.begin(),even.end());sort(odd.begin(),odd.end());if(even.size()==n||odd.size()==n){cout<<0<<endl;return;}int mx=*max_element(odd.begin(),odd.end());int ans=0,f=0;for(int i=0;i<even.size();i++){if(even[i]<mx){mx+=even[i];ans++;}else{f=(even.size()-1-i+2);break;}}if(f) ans+=f;cout<<ans<<endl;
}signed main(){int T=1;cin>>T;while(T--){solve();}return 0;
}

C 模拟+前缀和 灯能否全亮

在这里插入图片描述

考点:模拟,前缀和

思路:将每盏灯的每个打开时刻标记为1,关闭时刻标记为-1。当前时刻的前缀和为1即表示有一盏灯打开,为0则表示没有灯打开。最后判断是否有时刻打开灯的数量为n。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define int long long 
#define x first
#define y secondtypedef long long ll;void solve(){int n,k;cin>>n>>k;vector<int> a(n+1),s(8*k+2),c(8*k+1);int mx=0;for(int i=0;i<n;i++){cin>>a[i];mx=max(mx,a[i]);} int m=2*k;for(int i=0;i<n;i++){int t=a[i]%m,f=1;while(t<=8*k){if(f) c[t]++;else c[t]--;t+=k;f=1-f;}}for(int i=0;i<8*k;i++){s[i+1]=s[i]+c[i];}for(int i=mx%m+m+1;i<=8*k;i++){if(s[i]==n){int t=i-1-(mx%m+m);cout<<mx+t<<endl;return;}}cout<<-1<<endl;
}signed main(){int T=1;cin>>T;while(T--){solve();}return 0;
}

D 二分+DP 中位数尽可能大

在这里插入图片描述

考点:二分+序列DP

思路:对于中位数,大多数情况可以考虑二分。本题的trick是删除k个连续数的技巧。

代码1:本质思路

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;#define int long long
#define x first
#define y secondtypedef long long ll;
const int inf=1e9+10;
int u,v;void solve() {int n,k;cin>>n>>k;vector<int> a(n);for(int i=0; i<n; i++) cin>>a[i];if(k==1) {cout<<*max_element(a.begin(),a.end())<<endl;return;}if(n<=k) {sort(a.begin(),a.end());cout<<a[(n-1)/2]<<endl;return;}u=(n-1)/k+1,v=(n-1)%k+1;//这里要注意 vector<vector<int>> b(u+1,vector<int>(v+1));
//	vector<vector<int>> f(u+1,vector<int>(v+1,-inf));//不能在这里定义,不然f数组不能每次执行check函数就初始化一次 for(int i=0; i<u; i++) {for(int j=0; j<v; j++) {b[i][j]=a[i*k+j];}}auto check=[&] (int x) {vector<vector<int>> f(u+1,vector<int>(v+1,-inf));//不能全部初始为-1,要尽量初始化更小一点 for(int i=0; i<u; i++) {for(int j=0; j<v; j++) {if(i>0) f[i][j]=max(f[i][j],f[i-1][j]);if(j==0) {int t=(b[i][j]>=x?1:-1);f[i][j]=max(f[i][j],t);} else {if(j>0) f[i][j]=max(f[i][j],f[i][j-1]+(b[i][j]>=x?1:-1));if(i>0&&j>0) f[i][j]=max(f[i][j],f[i-1][j-1]+(b[i][j]>=x?1:-1));}
//				cout<<"----- "<<i<<" "<<j<<' '<<f[i][j]<<endl;}}int ans=-1e9;for(int i=0;i<u;i++){ans=max(ans,f[i][v-1]);}
//		return ans>=(v+2)/2;return ans>0;};//逗号 int l=1,r=1e9+10;while(l+1<r) {int mid=l+r>>1;if(check(mid)) l=mid;else r=mid;}cout<<l<<endl;}signed main() {int T=1;cin>>T;while(T--) {solve();}return 0;
}

代码2:优化

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y secondtypedef long long ll;
const int N=5e5+10,inf=1e9+10;
int a[N],b[N],f[N];
int n,k;bool check(int x){
//	memset(f,-0x3f,sizeof f);//一定要注意超时 for(int i=0;i<n;i++){if(a[i]>=x) b[i]=1;else b[i]=-1;}f[0]=b[0];for(int i=1;i<n;i++){if(i%k==0){f[i]=max(f[i-k],b[i]);}else{f[i]=f[i-1]+b[i];if(i>k){f[i]=max(f[i],f[i-k]);}}}return f[n-1]>0;
}void solve(){cin>>n>>k;for(int i=0;i<n;i++) cin>>a[i];int l=1,r=inf;while(l+1<r){int mid=l+r>>1;if(check(mid)) l=mid;else r=mid;} cout<<l<<endl;
}signed main(){int T=1;cin>>T;while(T--){solve();}return 0;
}

F1 模拟+镜像

在这里插入图片描述
考点:模拟+镜像

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
#define int long long 
string s;
int n,k,w,h;
int tx[2*N],ty[2*N];
map<pair<int,int>,int> cnt;void solve(){cin>>n>>k>>w>>h>>s;cnt.clear();int x=0,y=0;for(int i=0;i<n;i++){if(s[i]=='L') x--;if(s[i]=='R') x++;if(s[i]=='U') y++;if(s[i]=='D') y--;x=(x+2*w)%(2*w);y=(y+2*h)%(2*h);cnt[{x,y}]++;}int ans=0;for(int i=0;i<k;i++){int vx=(-i*x%(2*w)+2*w)%(2*w);int vy=(-i*y%(2*h)+2*h)%(2*h);ans+=cnt[{vx,vy}];}cout<<ans<<endl;
}signed main(){int T=1;cin>>T;while(T--){solve();}return 0;
}

这篇关于Codeforce 963的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112666

相关文章

codeforce 9C(Hexadecimal's Numbers)

来   看谁的代码短 C. Hexadecimal's Numbers time limit per test 1 second memory limit per test 64 megabytes input standard input output standard output One beautiful July morning

codeforce 7C 拓展欧几里得 详解

比如说  ax+by=gcd(a,b) 假设  excgcd(int a,int  b,int&x,int&y)是求解这个方程的函数 其返回值是gcd(a,b)(ps: a和b的最大公因子) 假设我们已经求得了b*x1+(a%b)*y1=gcd(a,b); x1 ,y1即为其解 又有  a%b=a-(a/b)*b; 带入得 a*y1+b*(x1-(a/b))=gcd(a,b); 而

滴滴二季度GTV达963亿元 经调整EBITA盈利13亿元

8月21日,滴滴在其官网发布2024年二季度业绩报告。 二季度,包括中国出行和国际业务在内的核心平台交易量为38.75亿单,较去年同期增长17.4%。其中,中国出行总单量为30.04亿单,较去年同期增长12.3%;国际业务总单量为8.71亿单,较去年同期增长39.1%。以此计算,中国出行及国际业务日均单量分别达3300万单、957万单,持续创历史新高。 单量的提升带动GTV规模持续增长

Codeforce 214 Div 2 B.Hometask

题目描述: Description Furik loves math lessons very much, so he doesn't attend them, unlike Rubik. But now Furik wants to get a good mark for math. For that Ms. Ivanova, his math teacher, gave him a

codeforce

http://codeforces.com/problemset/submit 学号  杭电密码

CodeForce #429 DIV2 A B C题解

A:http://codeforces.com/contest/841/problem/A 题意:n个气球分给k个人,是否有这样的解:每个人手里的气球都颜色不重复 思路:个数最多的颜色个球的个数 >k, 就必然有人手里两个球 #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>usin

CodeForce[1500-2000]——1950E Nearly Shortest Repeating Substring

codeforces刷题日记 题目大意:给你一个长度为n的字符串s,要寻找一个长度最小的字符串k,能够让字符串k进行1或多次的拼接,让拼接成的字符串和字符串s长度相等,且至多一个字母不一样。求k的最小长度。 思路:从1到n遍历k的长度i,如果i整除,就跳过,这时s被分成了n/i段,取出第一段和最后一段。如果这两段相等,那其他段必定和这两段一样(不一样的值字母允许存在一个),才符合条件。要是

codeforce round 735div2 -32

属于是打完多校脑子不转了,这题明明这简单的 掉大分,还好今天还一场 A 题意 选择一个连续子区间,让最大*最小值最大。 A 思路 显然是区间长为2时最大,扫一下就可以了。 想想也知道,我们选择两个时,拓展也是向两边拓展,如果有更小的,显然不拓展为好,如果有介于最大最小之间的,那么答案不会更优,假如有大于最大的,拓展后的答案也不会优于选择那个更大的数的长为二区间。 A 代码 #incl

扩展欧几里得,逆元初识(poj 1061+codeforce 7C line+hdu 1576 A/B)

poj 1061 青蛙的约会: #include <iostream>#include<cstdio>#define LL long longusing namespace std;LL gcd(LL a, LL b){return b?gcd(b,a%b):a;}void extend_Euclid(LL a,LL b,LL &x,LL &y){if(b ==

(CodeForce) Codeforces Round #541 (Div. 2) A,B,C,D,F

传送门 A. Sea Battle :围成的不规则图像的周长(就是矩形的周长),在加四个角重复的部分。 #include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<queue>#include<stack>#include<map>#include