2024牛客寒假算法基础集训营5
A
思路:1既不是质数也不是合数
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
void solve() {
int n;
cin>>n;
int m=n;
for(int i=0;i<n;++i){
int x;
cin>>x;
if(x==1)m--;
}
cout<<m;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
B
C
思路:模拟
对于一个大于1的数x,x减去1则可以在x旁添加1个0,最多添加x-1个,这样x和这些0这一段数的平均值为1;由于添加的0也会影响到原本x旁边的数y,那就取min(x-1,y-1),让x和y都同时减,统计总共减的个数
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
void solve() {
int n;
cin>>n;
vector<int>a(n);
for(int i=0;i<n;++i)cin>>a[i];
int ans=0;
ans+=a[0]-1;
for(int i=1;i<n-1;++i){
int c=min(a[i],a[i+1])-1;
ans+=c;
a[i]-=c,a[i+1]-=c;
}
if(n!=1)
ans+=a[n-1]-1;
cout<<ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
E
思路:首先偶数肯定是可以的,每次相邻数的差加一,可以操作无限次。其次是奇数,最后一个数是变不了的,那就是看能否让操作次数尽可能少,且倒数第二个数要不大于最后一个数。这里可以考虑倒着处理,由于最后一个数不能变,那就可以由它与前一个数的差值求出前一个数最多能操作多少次,往前同理。最后看序列是否非递减即可
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
void solve() {
int n;
cin>>n;
vector<int>ve(n+1),cnt(n+1);
for(int i=1;i<=n;++i){
cin>>ve[i];
}
if(n%2==0||n==1)cout<<"YES\n";
else{
int k=0;
for(int i=n-1;i>=1;--i){
if(i%2==0){
int now=ve[i]+k*i;
if(now>ve[i+1]){
cout<<"NO\n";
return ;
}
k+=(ve[i+1]-now)/i;
}
ve[i]+=k*i;
if(ve[i]>ve[i+1]){
cout<<"NO\n";
return ;
}
}
cout<<"YES\n";
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
// init();
while(t--){
solve();
}
return 0;
}
F
soyorin的数组操作(hard)
这道题很容易被easy影响到。最初想esay的做法时其实就是hard的答案
标签:typedef,const,winter,int,double,day3,long,week5,define From: https://www.cnblogs.com/bible-/p/18030641