第19回浙大校試合


目次
A Thanks, TuSimple!
B Even Number Theory
C Robot CleanerI
E Potion
G Postman
J  Extended Twin Composite Number
A Thanks, TuSimple!
【題意】n人の女子学生、m人の男子学生がいる.それぞれの身長をそれぞれ読み込んで1/0(彼より高い/低い人と踊る)を読み込んで、最大何人のペアを組むことができますか?
【分析】
4つのエリアに分かれています.彼より背の高い男性を探すには、彼より低い男性を探す必要があります.
それより高い女の子を探して、彼女より低い女の子を探します
4つの領域を並べ替えて、交差して解きます.
【コード】
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;
const int maxn=1e5+10;
ll a[maxn],b[maxn];
vectora1,b1,a2,b2;
ll n,m;

int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        ll n,m;scanf("%lld%lld",&n,&m);
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=0;i

B Even Number Theory
【題意】集合Eを定義し、集合内の数は偶数である.e-primeを定義することは、集合E内の偶数を表し、2つの異なる偶数aが存在しないことを満たし、bはaを×b=この数;
Pシーケンスを定義し、シーケンスの数はすべてe-primeです.
eを定義!,公式は問題を見て、ここkが偶数であるだけで良いことに注意して、それから分けることができる最も長い長さを求めます
【解析】2^nの長さは2^n−1であり、その後反復することが分かった.
例えばn=16、ans=15;n=20, ans=ans(16)+ans(20-16)=2^4-1+2^2-1=15+3=18
【コード】C++高精度…注意詳細処理例えばmemsetの初期化問題とA B C配列演算時の付与問題
#include
using namespace std;

const int maxn=1e3+10;
int A[maxn],B[maxn],C[maxn];

///  
string div(string a,int b)
{
    if(a=="0")return a;
    int len=a.length();
    string ans;
    int d=0;
    for(int i=0;i>s;
        s=div(s,2);
        int k=1;
        string ans;
        while(s!="")
        {
            string ss=div(add(s,"1"),2);
            s=div(s,2);
            ans=add(ans,mulit(ss,k));
            k++;
        }
        cout<

 
C Robot CleanerI
【題意】ロボットがあり、地図があり、このロボットには実行命令列がある.次のステップで実行する命令には計算式があります.そして、最大拾えるごみの数を計算します.
【分析】
地図上の各位置の数値は固定されているので、計算により、ゴミ拾いの操作でなければ(この位置の数値を0にする)次の指令も変わらない.だから直接シミュレーションします
vis配列記録位置(a,b)は何回通過し、fはゴミ拾いの回数、すなわち地図全体が新しい地図になる回数、すなわち輪数を記録する.(a,b)に着いたとき、まだこのラウンドでサイクルに入ったことを説明すると、breakは落ちます.
【コード】
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;
const int maxn=2010;
char mp[maxn][maxn];
int vis[2010][2010];
char s[250];

ll cal(int x,int y){
    return 81*(mp[x][y]-'0')+27*(mp[x-1][y]-'0')+9*(mp[x+1][y]-'0')+3*(mp[x][y-1]-'0')+(mp[x][y+1]-'0');
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int n,m;scanf("%d%d",&n,&m);
        int a,b;ll k;
        scanf("%d%d%lld",&a,&b,&k);
        scanf("%s",s+1);//       1  
        for(int i=1;i<=n;++i)
            scanf("%s",mp[i]+1);
        memset(vis,0,sizeof(vis));
        int f=1,cnt=0;
        while(k--)
        {
            if(vis[a][b]==f)break;
            vis[a][b]++;
            int xx=cal(a,b)+1;
            char dig=s[xx];//cout<0 && mp[a-1][b]!='1')a--;
            else if(dig=='D' && a+1<=n && mp[a+1][b]!='1')a++;
            else if(dig=='L' && b-1>0 && mp[a][b-1]!='1')b--;
            else if(dig=='R' && b+1<=m && mp[a][b+1]!='1')b++;
            else if(dig=='P' && mp[a][b]=='2')
            {
                mp[a][b]='0';
                cnt++;
                f++;
            }
        }
        printf("%d
",cnt); } return 0; }

E Potion
【題意】
まずn個の数が需要を表し、さらにn個の数が在庫を表す.レベルごとに読み込みます.
等級の高いものは等級の低いものに降格することができ、何度も降格することができる.
すべてのニーズを満たすことができるかどうかを尋ねる
【分析】
高いレベルから低いレベルまで遍歴して、多いのは隣接する低いレベルに加えて、最後に完成するかどうかを見ます
【コード】
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;
const int maxn=110;
ll a[maxn],b[maxn];

int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int n;scanf("%d",&n);
        for(int i=0;i=0;--i)
        {
            if(b[i]>=a[i])
            {
                if(i!=0)b[i-1]+=b[i]-a[i];
                f=1;
            }
            else
            {
                f=0;break;
            }
        }
        if(f)puts("Yes");
        else puts("No");
    }
    return 0;
}

G Postman
【題意】郵便局は原点で、1人で送る場合は毎回最大k通まで、k通が終わったら郵便局に戻って手紙を取り続け、すべての手紙を送る最低距離を尋ねる
【分析】原点を両端に分割し、いずれも絶対値が最大の部分から遍歴し、i+=k、道のりを2に乗じ、最後の両端の道のりを合わせて、負の値が最小のものと正の値が最大のものをそれぞれ減算し、minを求める.全正または全負の場合は、特殊な処理(元のシーケンスの絶対値をaa配列に格納)
【コード】
#include
#include
#include
#include
#include
#include
#include
using namespace std;

const int maxn=1e5+10;
typedef long long ll;
vectora,b;
ll aa[maxn];

int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int n,k;scanf("%d%d",&n,&k);
        a.clear();b.clear();
        memset(aa,0,sizeof(aa));
        for(int i=0;i0)b.push_back(x);
            if(x<0)x=-x;aa[i]=x;
        }
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        int len1=a.size(),len2=b.size();
        ll ans1=0;
        int num;
        if(len1==0 || len2==0)
        {
            sort(aa,aa+n);
            for(int i=n-1;i>=0;i-=k)
                ans1+=aa[i]+aa[i];
            ans1-=aa[n-1];
            printf("%lld
",ans1); continue; } for(int i=0;i=0;i-=k) ans1+=b[i]+b[i]; printf("%lld
",min(ans1+a[0],ans1-b[len2-1])); } return 0; }

J  Extended Twin Composite Number
【題意】nを入力し、xを出力し、yはx+n=yを満たし、x,yはすべて合数である
【分析】
nを入力するため、大きい方向にとってnはパリティの区別があります;
まず最初のいくつかの合数を書き出します:4 6 8 9 10 12 14 16 18 20...
nが偶数であればx+2 n=yがあり、xとyがともに偶数であればxが偶数であればよいので、最初の合数4をとると4 n+4が出力される
nが奇数であればx+2 n+1=yがあり、yを偶数にし、最初の奇数合数9をとり、9 n+9を出力する
【コード】
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;

int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        ll n;scanf("%d",&n);
        if(n%2==0)
        {
            printf("4 %lld
",n+4); } else printf("9 %lld
",n+9); } return 0; }