2020牛客多校第三场

A 贪心

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
typedef long long ll;
const int N = 2e6+5;
ll pow_mod(ll a, ll n, ll m){///aµÄn´Î·½Ä£m
    if(n == 0)  return 1;
    ll x = pow_mod(a, n/2, m);
    ll ans = x * x % m;
    if(n % 2 == 1) ans = ans *a % m;
    return ans;
}
int gcd(int a,int b)   {return a%b==0?b:gcd(b,a%b);}
int mi(int a,int b)    {return a<b?a:b;}
int ma(int a,int b)    {return a>b?a:b;}
int abs(int a)         {return a>0?a:-a;}
char s[N];
int num[N];
int main(){
    int q;
    scanf("%d",&q);
    while(q--){
        int n;
        scanf("%d", &n);
        scanf("%s", s + 1);
        int cnt=0;
        for(int i = 1 ; i <= n ; i++){
            if(s[i] == '0'||s[i]=='1')  cnt++;
            num[i] = cnt;
        }
        int ans = 0, res = 0;
        for (int i = 1; i <= n; ++ i){
            if (s[i] == '0'){
                if (res>0) {
                    ++ ans;
                    -- res;
                }
            }else if(s[i] == '1'){///1的时候是钓鱼合适做饵
                if(res > cnt - num[i]){
                    ++ ans;
                    -- res;
                }
                else res++;
            }else if (s[i] == '2'){
                ++ ans;
            }else {
                ++ ans;
                //++ res;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

B 数据结构,模拟指针位置即可

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<ll, ll> pll;
const int mod = 1e9 + 7;
const int N = 2e6 + 10;
const int INF = 0x3f3f3f3f;
ll qpow(ll base, ll n){ll ans = 1; while (n){if (n & 1) ans = ans * base % mod; base = base * base % mod; n >>= 1;} return ans;}
ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}
char s[N];
int main(){
    scanf("%s", s);
    int n = strlen(s);
    int q;
    cin >> q;
    int p = 0;
    while (q --){
        char op[2];
        int x;
        scanf("%s %d",op, &x);
        if (op[0] == 'A'){
            printf("%c\n", s[(p + x - 1 + n) % n]);
        }else {///左边x个移到右边相当于指针加X,右边移到左边同理
            p = (p + x + n) % n;
            //cout << p << endl;
        }
    }
    return 0;
}

C 计算几何,判断顺时针逆时针

#include<bits/stdc++.h>
using namespace std;
#define eps 1e-1
typedef long long ll;
const int N = 2e6+5;
double bs(double a)         {return a>0?a:-a;}
struct node{
    double x,y;
}p[25];
double dis(node a,node b){
    double tem = (a.x-b.x) * (a.x-b.x) + (a.y-b.y) * (a.y-b.y);
                   // printf("%.4f %.4f %.4f %.4f \n",a.x,a.y,b.x,b.y);
    //printf("%.4f\n",tem);
    return tem;
}
int main(){
    int q;
    scanf("%d",&q);
    while(q--){
        int pp=1,ld;///逆时针
        for(int i = 1 ; i <= 20 ; i++)
            scanf("%lf %lf",&p[i].x,&p[i].y);
        p[0].x=p[20].x;p[0].y=p[20].y;
        p[21].x=p[1].x;p[21].y=p[1].y;
        p[22].x=p[2].x;p[22].y=p[2].y;
        for(int i = 1 ; i <= 20 ;i++){
            if(bs(dis(p[i],p[i-1])-81) <= eps){
                ld = i;
                break;
            }
        }
        if ((p[ld+1].x - p[ld].x) *(p[ld+2].y - p[ld].y) -(p[ld+2].x - p[ld].x) *(p[ld+1].y-p[ld].y) < 0)
            pp = 0;/// ("顺时针") ;
        //printf("%d\n",pp);
        //printf("%d\n",ld);
        //printf("%f\n",dis(p[20],p[19]));
        if(ld>1){
            if(pp){
                if( bs( dis(p[ld-1],p[ld-2])- 36.0 ) <= eps)   printf("right\n");
                else                                printf("left\n");
            }
            else{///顺时针
                if(bs(dis(p[ld],p[ld+1])- 36.0) <= eps)   printf("right\n");
                else                                printf("left\n");
            }
        }
        else{
            if(pp){//printf("???");
                if(bs(dis(p[20],p[19])- 36.0) <= eps)   printf("right\n");
                else                                printf("left\n");
            }
            else{///顺时针
                if(bs(dis(p[1],p[2])- 36.0) <= eps)   printf("right\n");
                else                                printf("left\n");
            }
        }
    }
    return 0;
}


E构造

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 2e5+5;
ll a[N],ans[N];
int main(){
    int t,n;    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++) ans[i]=INF;
        ans[4] = a[4]-a[1];
        for(int i=6;i<=n;i+=2)
            ans[i]=min(ans[i-4]+a[i]-a[i-3],ans[i-6]+a[i]-a[i-5]);

        printf("%lld\n",ans[n]*2);
    }
    return 0;
}
/*
sort后
n = 4
1 2 3 4
找到最优
q: a4 - a3 + a2 - a1
p: a4 - a1 + a3 - a2
合并之后 ans为 2*(a4-a1);
1 2 3 4 5 6
同理
a2 + a4 + a6 - a1 - a3 - a5 + a3 - a2 + a5 - a4 + a6 - a1
当n=8时
假设找到最优解:为
2*( a8 - a1)
实际上用两个n等于4的环答案更优,
2*(a8 - a5 + a4 - a1)       (a4-a5)<0
n= 10 12………………可递推
最后发现拆成4 和 6 的环是最优的。
*/

F 扩展欧几里得

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi 3.141592654
typedef long long ll;
const int N = 2e6+5;
ll vis[N];
ll prim[N],cnt=0;///记录素数个数
ll num[N]={1,1};///记录i的一个质因子
void fun(){///欧筛
	for (ll i = 2; i < N; i++) {
    //cout<<i;
		if (vis[i] == 0) 	{prim[++cnt] = i;num[i] = i;}///记录素数
		for (ll j = 1; (j <= cnt) && (i*prim[j]) < N; j++) {
			vis[i*prim[j]] = 1;
            num[prim[j]*i]=prim[j];
			if (i%prim[j] == 0)break;
		}
	}
}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll ex_gcd(ll a,ll b,ll& x,ll& y) {//扩展欧几里得算法
    ll tem = a;
    if(!b)    x = 1,y=0;
    else{ tem = ex_gcd(b,a%b,y,x);  y-= a/b*x;}
    return tem;
}

int main(){
    int q;
    fun();
    //for(int i = 1 ; i < N ; i++)    printf("%d %lld\n",i,num[i]);
    ll a,b,c,d,e,f,x,y;
    scanf("%d",&q);
    while(q--){
        scanf("%lld %lld",&a,&b);
        ll g = gcd(a,b),flag=1;
        if(g>1){///1:ab不互质
            c = a/g+1;  d = b/g;
            e = -1;      f = b/g;
        }else{
            //printf("%lld,%lld\n",num[b],b/num[b]);
            d = num[b],f=b/num[b];///确定分母
            while(f%num[b] == 0 && f!=1) d*=num[b],f/=num[b];///检查是否为单一质因子
            if(f==1)    flag=0;
            else{///非单一质因子
                ex_gcd(f,d,x,y);///f*x + d*y = 1
                c = x*a;    e = y*a;
                if(c<0)     swap(c,e),swap(d,f);
            }
        }
        if(flag)        printf("%lld %lld %lld %lld\n",c,d,-e,f);
        else            printf("-1 -1 -1 -1\n");
    }
    return 0;
}

L 签到

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
typedef long long ll;
const int N = 1e5+5;
ll pow_mod(ll a, ll n, ll m){///aµÄn´Î·½Ä£m
    if(n == 0)  return 1;
    ll x = pow_mod(a, n/2, m);
    ll ans = x * x % m;
    if(n % 2 == 1) ans = ans *a % m;
    return ans;
}
int gcd(int a,int b)   {return a%b==0?b:gcd(b,a%b);}
int mi(int a,int b)    {return a<b?a:b;}
int ma(int a,int b)    {return a>b?a:b;}
int abs(int a)         {return a>0?a:-a;}
char s[10000005];
int main(){
    while(scanf("%s",s)!=EOF){
        //char kkk = toupper('k');    printf("%c\n",kkk);
        for(int i = 0 ; i<6;i++)    if(s[i]<='Z'&&s[i]>='A')   s[i]=tolower(s[i]);
        //puts(s);
        if(s[0] == 'l' && s[1]=='o' &&s[2] == 'v' && s[3] == 'e' &&s[4] == 'l' &&s[5] == 'y')   printf("lovely\n");
        else printf("ugly\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值