2022河南萌新联赛(一)

2022河南萌新联赛(一)

1.A-Alice and Bob_2022河南萌新联赛第(一)场:河南工业大学 (nowcoder.com)

alice 和 bob,很明显这是一个博弈论。考虑将n看作石头。因为他是每次n/a^k,可以考虑将他分解质因数,最后就会分解成类似这样的新式

$$
N=p_{1}^{x_{1}}*p_{2}^{x_{2}}*p_{3}^{x_{3}}........*p_{n}^{x_{n}}
$$

任何一个数都是可以分解成这样的形式的。而且p1-pn是质数。因为任何一个偶数都可以写成n个质数相乘。最后就是一个简单的组合nim游戏。有n堆石头,每次可以在n堆石头中取无穷多个。那最后的sg(x)=x;最后求总的sg值就是把每一堆的sg值异或起来。但是最后把石头取光是必败点。所以就是一个反的nim游戏。赢的情况有两种,

一种是每堆石头只有一个并且是偶数堆。

另一种是踩是nim和不为0,但是存在至少一堆石头是大于1的。这里用到是anti---nim的结论。

然后就解出来了

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//length cd

void slove(){
ll n;
cin>>n;
int f=0,res=0;
for(int i=2;i<=sqrt(n)+5;i++){
int cnt=0;
while(n%i==0){
n/=i;
cnt++;
}
if(cnt>1)f=1;
res^=cnt;
}
if(n>1){
res^=1;
}
if((!res&&!f)||(res&&f)) cout<<"Alice win"<<endl;
else cout<<"Bob win"<<endl;
}
int main()
{
IOS
   int t=1;
   while(t--) {
       slove();
  }
   return 0;
}

2.C-割竿榄_2022河南萌新联赛第(一)场:河南工业大学 (nowcoder.com)

首先考虑两种情况。

第一种是割的次数不能把他全部割掉。这是考虑选择价值最大的一个区间,把他全部割掉。

第二种情况是可以全部割掉,考虑留下可以把他全割掉的次数,其余的次数让他生长(就是割的高度比最高的还呗)。然后最后再处理。但是这还的细分。

1.如果是n%3==0,这样就不需要多余考虑,只需要每次割掉三个就好。

2.如果是n%3!=0,那就只能是取模等于1和2这两种情况,那就拿4和5举例。4就选择先割123,再割234,但是这样一就会留下一单位 没有割。如果是5的话,考虑先把123割掉,在把45割掉但是这样3就没有生长。两种相比于全割掉的情况这是少了1的。

同时最后再考虑在割的时候后面的还会长就可以解决这道题了。

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define CST ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//length le
const int N=1e5+10;
ll n,m;
ll a[N];
ll s[N];
void slove()
{
   cin>>n>>m;
   fel(i,1,n) {
       cin>>a[i];
       s[i]=s[i-1]+a[i];
  }
   ll res=0;
   if(m*3>=n) {
       if(n%3==0) {
           //这是考虑就是留下n/3次把他们全割掉,其余次数让他们长高
           res+=s[n];
           for(int i=0; i<n/3; i++) {//割的时候后面会长高
               res+=i*3;
          }
           res+=(m-n/3)*n;
      } else {
           //留下n+2/3的机会割他们,其他机会长高
           res+=s[n]-1;//对于4的情况是先砍123在砍234但是你要让他们都可以生长,所以先割123给3留下1再全割完所以一还剩1
           //对于五的情况,就是先割完123再割45,3没长也是少一,所以综合下来就是少一
           for(int i=0; i<(n+2)/3; i++) {
               res+=i*3;
          }
           res+=(m-(n+2)/3)*n;
      }
  } else {
for(int i=1,j=3*m;j<=n;i++,j++){
res=max(res,s[j]-s[i-1]);
}
for(int i=0;i<m;i++){
res+=i*3;
}
  }
   cout<<res;
}
int main()
{
   int t=1;
   //cin>>t;
   while(t--) {
       slove();
  }
   return 0;
}

 

3.E-聚会_2022河南萌新联赛第(一)场:河南工业大学 (nowcoder.com)

首先我们先对每对活跃度排个序。

然后对a[i]考虑,前面i-1个数表示的范围是1-x.

1.如果你a[i]>x+1的,那就无法表示x+1

2.如果你a[i]<=x+1,那x+1可以表示。

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef pair<int,char> PII;
#define x first
#define y second
//length cd
const int N=1e5+100;
ll n;
ll a[N];
void slove(){
cin>>n;
fel(i,1,n)cin>>a[i];
sort(a+1,a+1+n);
ll rr=0;
fel(i,1,n){
if(a[i]>rr+1){
cout<<rr+1<<endl;
return;
}
else rr+=a[i];
}
cout<<rr+1<<endl;
}
int main(){
slove();
return 0;
}

4.I-巡逻机器人_2022河南萌新联赛第(一)场:河南工业大学 (nowcoder.com)

这个题有两种做法模拟和二分。

首先看模拟,模拟只要知道一点就是每两个机器人相遇可以视为不转头,因为转头的话一个机器人会走另外一个机器人本来会走的路径,想清楚这一点就很好写了。

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef pair<int,int> PII;
//length cd
const int N=1e6+100;
int n,m;
bool vis1[N],vis2[N];
int s[N],x,t;
char y;
int main()
{
IOS
cin>>n>>m;
queue<PII>q1,q2;
fel(i,1,n){
cin>>x>>y;
if(y=='L')q1.push({x-1,0});
else q2.push({x-1,0});
}
   fel(i,0,n-1) s[i]=INT_MAX;
while(!q1.empty()){
auto[x,y]=q1.front();
q1.pop();
if(vis1[x]) continue;
vis1[x]=1;
s[x]=min(s[x],y);
t=(x-1+n)%n;
q1.push({t,y+1});
}
while(!q2.empty()){
auto[x,y]=q2.front();
q2.pop();
if(vis2[x]) continue;
vis2[x]=1;
s[x]=min(s[x],y);
t=(x+1)%n;
q2.push({t,y+1});
}
int mx=-1;
fel(i,0,n-1){
mx=max(s[i],mx);
}
cout<<mx;
   return 0;
}

另外一种做法是二分,二分答案,看机器人在这个时间能不能巡逻完所有的门,然后check函数用差分就好,考虑的他的巡逻区间a[l]++

a[r+1]--,然后特殊处理一下1和终点的位置就好了。

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef pair<int,char> PII;
#define x first
#define y second
//length cd
const int N=1e6+100;
PII a[N];
int f[N],m,n;
bool check(int mid){
memset(f,0,sizeof(f));
fel(i,1,n){
if(a[i].y=='R'){
if(a[i].x+mid<=m){
f[a[i].x]++,f[a[i].x+mid+1]--;
}
else{
f[a[i].x]++,f[m+1]--,f[1]++,f[a[i].x+mid-m+1]--;
}
}
else{
if(a[i].x-mid>=1){
f[a[i].x-mid]++,f[a[i].x+1]--;
}
else{
f[1]++,f[a[i].x+1]--,f[a[i].x-mid+m]++,f[m+1]--;
}
}
}
for(int i=1;i<=m;i++){
f[i]+=f[i-1];
if(!f[i]) return false;
}
return true;
}
void slove(){
cin>>m>>n;
fel(i,1,n){
cin>>a[i].x>>a[i].y;
}
int l=0,r=m;
while(l<r){
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
int main(){
slove();
return 0;
}

5.J-樱果运输_2022河南萌新联赛第(一)场:河南工业大学 (nowcoder.com)

就是二维背包,把运费和载货量视为背包容量,卡车数视为价值。

然后跑一下背包,再看大于货量的最小钱数是多少就可以了

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef pair<int,char> PII;
#define x first
#define y second
//length cd
const int N=1e5+100;
int n,m;
int dp[1010][1010];//一维表运费二维表体积
int main(){
   cin>>n>>m;
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<=1000;i++){
dp[i][0]=0;
}
fel(i,1,n){
int w,t;
cin>>w>>t;
for(int j=1000;j>=w;j--){
for(int k=1000;k>=t;k--){
dp[j][k]=min(dp[j][k],dp[j-w][k-t]+1);//选这辆车和不选这辆车
}
}
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
int res=0x3f3f3f3f;
for(int j=0;j<=x;j++){
for(int k=y;k<=1000;k++){
res=min(dp[j][k],res);
}
}
if(res==0x3f3f3f3f) cout<<-1<<endl;
else cout<<res<<endl;
}
return 0;
}
 
posted @ 2022-07-25 23:08  silky__player  阅读(54)  评论(0)    收藏  举报