一次巨水的模拟赛

考试题目

害羞

十年 O I OI OI一场空 , , 不开 l o n g l o n g long long longlong见祖宗。

T1
这题单调队列优化 d p dp dp作为 T 1 T1 T1难度还说的过去
首先可以反方向地想
渣男 H H HH HH不能超过连续娶 k k k个妹子和在每 k + 1 k+1 k+1个里甩一个妹子是等价的
d p [ i ] dp[i] dp[i]表示前 i i i个所有被甩的妹子的漂亮程度的最小总和
那么 d p [ i ] = a [ i ] + m i n { d p [ j ] } , i − k − 1 < j < i dp[i]=a[i]+min\{dp[j]\},i-k-1<j<i dp[i]=a[i]+min{ dp[j]}ik1<j<i
但是复杂度 O ( n 2 ) O(n^2) O(n2) , n = 100000 , n=100000 n=100000肯定过不了…
所以我们选择单调队列优化
这时候 一个大问题来了 我不想 O ( n ) O(n) O(n)过 怎么办呢?其实是忘了咋打单调队列了
那就用优先队列吧…

#include<bits/stdc++.h>
using namespace std;
#define N int(1e5+10)
#define reg register
typedef long long ll;
inline void read(ll &x){
    
    
    ll s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
    
    if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){
    
    s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
    x=s*w;
}
struct node{
    
    
    ll pos,val;
    bool operator <(const node &x) const{
    
    
        return x.val<val;
    }
}c;
priority_queue<node> q;
ll n,k,ans,sum=1e16,a[N],dp[N];
int main(){
    
    
    read(n),read(k);
    for(reg int i=1;i<=n;i++)read(a[i]),ans+=a[i];
    c.pos=0,c.val=0,q.push(c);
    for(reg int i=1;i<=n;i++){
    
    
        dp[i]+=a[i];
        while(!q.empty()&&q.top().pos<i-k-1)q.pop();
        dp[i]+=dp[q.top().pos];
        c.pos=i,c.val=dp[i];q.push(c);
    }
    for(reg int i=n-k;i<=n;i++)sum=min(sum,dp[i]);
    printf("%lld\n",ans-sum);
}

新人

g c d ( a , b ) = g c d ( b , a − b ) gcd(a,b)=gcd(b,a-b) gcd(a,b)=gcd(b,ab)

T2.1
T2.2
这题叫做思维题 o r or or数论题?
叫啥也应该都可以用三个字概括 : : 傻逼题
找到 1 1 1 n − 1 n-1 n1 g c d ( a , b ) gcd(a,b) gcd(a,b)递归层数最少的就好咯
上代码

#include<bits/stdc++.h>
using namespace std;
#define inf int(1e8)
inline void read(int &x){
    
    
    int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
    
    if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){
    
    s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
    x=s*w;
}
int gcdd(int a, int b){
    
    
    if(!b)return inf;
    if(b==1)return a-1;
    return gcdd(b,a%b)+a/b;
}
int n,now=inf;
int main(){
    
    
    read(n);
    for(int i=1;i<=(n+1)/2;i++)now=min(now,gcdd(n,i));
    printf("%d\n",now);
}

人和

傻人有傻福 , , ,但傻 A C AC AC没有

T3.1T3.2
e r r err err水贪心?从小到大?入门?
那你试
4 4 4
1   1   1   4 1\,1\,1\,4 1114
(傻*
从大到小 …一个一个选
上代码

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N int(1e6+100)
inline void read(int &x){
    
    
    int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
    
    if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){
    
    s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
    x=s*w;
}
int n,a[N],now,ans;
bool w;
bool cmp(int x,int y)
{
    
    
    return x>y;
}
int main()
{
    
    
    read(n);
    for(reg int i=1;i<=n;i++)read(a[i]);
    sort(a+1,a+1+n,cmp);
    w=true,now=a[1];
    for (int i=1;i<=n;i++)
    {
    
    
        if (a[i]<now&&!w)now=a[i];
        now--;
        if(!now)now=a[i],ans++,w=false;
    }
    printf("%d\n",ans);
}

把话撂这了 能 H a c k Hack Hack我这个贪心我请全机房一人一杯晶一学长 此行不删

10.22 の U P D : 10.22のUPD: 10.22UPD:
8 8 8
6   6   6   6   6   6   1   0 6\,6\,6\,6\,6\,6\,1\,0 66666610
于是就有了下面的:

在这里插入图片描述在这里插入图片描述
真香…
现在 8 : 28 8:28 8:28 8 : 30 8:30 8:30出分
A K AK AK D a w n Dawn Dawn直播吔*
U P D : UPD: UPD:显然 A K AK AK 2333 2333 2333

猜你喜欢

转载自blog.csdn.net/dhdhdhx/article/details/102670669