SCAU2020暑假组队排位#5 gym102055

A----Mischievous Problem Setter Gym - 102055A(bool----sort水题)

在这里插入图片描述
在这里插入图片描述

题意:

给定时间,做题。做题由易到难,最多做几道。

AC

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
struct point {
    int d, ti;
    bool operator<(const point &x)const{
        return d<x.d||(d==x.d&&ti<x.ti);
    }
}p[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,kase=0;
    cin>>t;
    while(t--){
        int n,m;cin>>n>>m;
        for(int i=1; i<=n; i++)cin>>p[i].d;
        for(int i=1; i<=n; i++)cin>>p[i].ti;
        sort(p+1,p+1+n);
        int ans=0;
        for(int i=1; i<=n; i++){
            if(p[i].ti<=m){
                m-=p[i].ti;
                ans++;
            }
            else break;
        }
        cout<<"Case "<<++kase<<": ";
        cout<<ans<<endl;
    }
    return 0;
}

G题 题解(组合和思维)

传送门。。。。

I----Cockroaches Gym - 102055I(注意好讨论)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意:

可以选择一行和一列消除。
求最多消除多少zl。并输出有多少种方案。

AC

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#define mp make_pair
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
typedef pair<int,int>pa;
map<pa,int>cot;
map<int,int>xcnt,ycnt;
struct point {
    int x,y;
}p[maxn];
int main()
{
  //  ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,kase=0;scanf("%d", &t);//cin>>t;
    while(t--){
     //   cot.clear();
        xcnt.clear();ycnt.clear();
        int n;scanf("%d", &n);//cin>>n;
        int maxr=0, maxc=0;
        for(int i=1; i<=n; i++){
            scanf("%d%d", &p[i].x,&p[i].y);//cin>>p[i]
            xcnt[p[i].x]++,ycnt[p[i].y]++;
            maxc=max(maxc,xcnt[p[i].x]);
            maxr=max(maxr,ycnt[p[i].y]);
        }
        printf("Case %d: ", ++kase);
        if(xcnt.size()==1||ycnt.size()==1){
            printf("%d 1\n",n);
            continue;
        }
        if(maxr==1&&maxc==1){
            printf("2 %lld\n", (ll)n*(ll)(n-1)/2);
            continue;
        }
        ll num_r1,num_r2,num_c1,num_c2;
         num_r1=num_r2=num_c1=num_c2=0;
        for(auto x:xcnt){
            if(x.second==maxc)num_c1++;
            else if(x.second==maxc-1)num_c2++;
        }
        for(auto y:ycnt){
            if(y.second==maxr)num_r1++;
            else if(y.second==maxr-1)num_r2++;
        }
        ll ans1=num_c1*num_r1;
        ll ans2=num_c1*num_r2+num_c2*num_r1;
        for(int i=1; i<=n; i++){
            int x,y;
            x=p[i].x;y=p[i].y;
            if(xcnt[x]+ycnt[y]==maxc+maxr)ans1--,ans2++;
            if(xcnt[x]+ycnt[y]==maxc+maxr-1)ans2--;
        }
        if(ans1)printf("%d %lld\n", maxc+maxr, ans1);
        else printf("%d %lld\n", maxc+maxr-1,ans2);
    }
    return 0;
}

L----Ultra Weak Goldbach’s Conjecture Gym - 102055L(构造&&质数)

在这里插入图片描述
在这里插入图片描述

题意:

哥德巴赫猜想的升级。

思路:

构造。
看第一个smaple
13=2+2+2+2+2+3;
那么我们能否前面几个由2组成,后面拿prime去凑?
答案是: Y E S YES YES

  1. 假如n是odd奇数,那么我们前面先配2,2,2,3.保证有一个奇数。
    因为假如剩下两个质数中没有2的话,那prime1和prime2一定是奇数。(质数中除了2,以外都是奇数),且prime1+prime2=even,最后就凑出了这个odd。
  2. res=n-6-3。至于最后两个prime1,prime2的找法:就是枚举prime1,满足if(res-prime1)为质数,就找到了prime2了。
  3. 假如n是even偶数,那么就2,2,2,2.最后同步骤2.,不过res=n-8.

AC

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll a[10];
ll pri[maxn],vis[maxn],cnt=0;
void table(){
    for(int i=0; i<maxn; i++)vis[i]=1;
    for(ll i=2; i<maxn; i++){
        if(vis[i]){
            pri[++cnt]=i;
            for(int j=i*2; j<maxn; j+=i)vis[j]=0;
        }
    }
}
bool prime(ll x){
    ll mid=sqrt(x);
    if(x<1)return false;
    for(ll i=2; i<=mid; i++){
        if(x%i==0)return false;
    }
    return true;
}
void work(ll x){
    if(x&1){
        x-=9;
        printf("2 2 2 3 ");
        for(int i=1; i<=cnt; i++){
            if(prime(x-pri[i])){printf("%lld %lld\n", pri[i], x-pri[i]);return;}
        }
    }
    else {
        x-=8;
        printf("2 2 2 2 ");
        for(int i=1; i<=cnt; i++){
            if(prime(x-pri[i])){printf("%lld %lld\n",pri[i],x-pri[i]);return ;}
        }
    }
}
int main()
{
    //cout<<prime(2)<<' '<<prime(1);
   // ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,kase=0;scanf("%d", &t);//cin>>t;
    table();
    while(t--){
        ll x;scanf("%lld", &x);//cin>>x;
        printf("Case %d: ", ++kase);
        if(x<=11){printf("IMPOSSIBLE\n");continue;}
        work(x);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值