157 - The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror)部分题解

版权声明:转载时 别忘了注明出处 https://blog.csdn.net/ZCY19990813/article/details/89310058

Postman

Sample Input
2
5 3
-1 -2 3 -4 -5
6 3
1 0 -2 -1 1 2
Sample Output
13
6

题意:邮递员送信,有n封信,背包容量为k,没有信要回邮局拿信,邮局的位置是0,送完最后一封信不用回邮局,问走的最短距离是多少。例如第一个样例,可以先拿一封信去3位置回邮局拿信一封信,再去-1位置回邮局拿3封信,送到-5结束。

思路:将负数放在一起,正数放在一起,排序,将数轴最两边的k封信最远位置加一次,然后从两头每k个选最远位置乘以2加起来,最后讨论两头哪个小再加一次。也就是最远的k封信送完就不用回来了。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <string>
#include <deque>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <set>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int M=1e5+10;
int a[M],b[M],c[M];
priority_queue <int,vector<int>,greater<int> > q;
int main()
{
     ll t,n,k,i,j;
     cin>>t;
     while(t--)
     {
         cin>>n>>k;
         ll x=0,y=0;
         memset(b,0,sizeof(b));
         memset(c,0,sizeof(c));
         for(i=0;i<n;i++)
         {
             cin>>a[i];
             if(a[i]>=0)
                b[x++]=a[i];
             else
                c[y++]=a[i];
         }
         sort(b,b+x);
         sort(c,c+y);
         ll ans=0;
         for(i=0;i<y;i+=k)//注意是i+=k,不足k封信当k封信来送,下同
         {
             if(i==0)
                ans+=abs(c[i]);
            else
                ans+=2*abs(c[i]);
         }
         for(i=x-1;i>=0;i-=k)
         {
             if(i==x-1)
                ans+=b[i];
             else
                ans+=2*b[i];
         }
         ans+=min(abs(c[0]),abs(b[x-1]));//最远的不用加了,不需要回邮局
         cout<<ans<<endl;
     }
     return 0;
}

Potion

Sample Input
2
3
3 3 1
1 2 5
3
3 1 2
5 2 1
Sample Output
Yes
No

题意:两个数组,第一个数组是买书需要花的钱数,第二个是手里有的钱数,从右往前依次买书,可以利用之前手里结余的钱,问可以买下所有的书吗。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <string>
#include <deque>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <set>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int M=1e5+10;
int a[M],b[M];
priority_queue <int,vector<int>,greater<int> > q;
int main()
{
     ll t,n,k,i,j;
     cin>>t;
     while(t--)
     {
         cin>>n;
         for(i=0;i<n;i++)
            cin>>a[i];
        for(i=0;i<n;i++)
            cin>>b[i];
        ll p=0;//现在手里可以有的多余的钱
        ll flag=0;
        for(i=n-1;i>=0;i--)
        {
            if(b[i]+p<=a[i])
            {
                flag=1;
                break;
            }
            if(b[i]<=a[i])
            {
                p-=a[i]-b[i];
            }
            else
            {
                p+=b[i]-a[i];
            }
        }
        if(flag==1)
            cout<<"No"<<endl;
        else
            cout<<"Yes"<<endl;

Extended Twin Composite Number

Sample Input
3
11
1805296
5567765
Sample Output
4 15
114514 1919810
111234 5678999

题意:给出一个数n,要求x+n=y,求任意两个数x,y满足x,y都不是素数。

题目给的数据范围超大,其实题目很简单,判奇数偶数,4 9肯定不是素数,如果是奇数的时候直接输出9和n+9就行,n+9一定是偶数,不是素数;同理,当n是偶数的时候,4+n一定是偶数。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <string>
#include <deque>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <set>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int M=1e5+10;
int a[M],b[M];
priority_queue <int,vector<int>,greater<int> > q;
int main()
{
     int t,n;
     scanf("%d",&t);
     while(t--)
     {
         scanf("%d",&n);
         if(n%2==0)
             printf("4 %d\n",n+4);
         else
            printf("9 %d\n",n+9);
     }
     return 0;
}

Thanks, TuSimple!

Sample Input
1
3 3      //男生和女生的人数
1 2 5    //男生的身高
3 4 6    //女生的身高
1 1 0    //男生的要求1代表要找比他高的女生 0代表要找比他矮的女生
0 0 1    //女生的要求
Sample Output
2        //问最多可以匹配几对

思路:用结构体来存储,将男生要求为1的,女生要求为0的放到一个新的数组里面,其他放到另一个新的数组里面。

对每一个数组排序,遍历。如果要求为1,num++,反之,如果num>0(num--,ans++),这样肯定能保证配对的数量。

注意c,d数组开大一点,因为是合起来的数组。

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
typedef long long ll;
const int MAX=2e5+7;
deque <ll> dq;
typedef long long ll;
struct A
{
    ll h;
    ll q;
}a[MAX],b[MAX],c[MAX],d[MAX];

ll cmp(A x,A y)
{
    return x.h<y.h;
}
int main()
{
    ll T,i,j,n,m;
    cin>>T;
    while(T--)
    {
        //c是男生的1和女生的0,d是男生的0和女生的1
        scanf("%lld %lld",&n,&m);
        ll e=0,ee=0;
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        for(i=0;i<n;i++)
            scanf("%lld",&a[i].h);
        for(i=0;i<m;i++)
            scanf("%lld",&b[i].h);
        for(i=0;i<n;i++)
        {
            scanf("%lld",&a[i].q);
            if(a[i].q==1)
            {
                c[e].h=a[i].h;
                c[e].q=a[i].q;
                e++;
            }
            else
            {
                d[ee].h=a[i].h;
                d[ee].q=a[i].q;
                ee++;
            }
        }

        for(i=0;i<m;i++)
        {
            scanf("%lld",&b[i].q);
            if(b[i].q==0)
            {
                c[e].h=b[i].h;
                c[e].q=b[i].q;
                e++;
            }
            else
            {
                d[ee].h=b[i].h;
                d[ee].q=b[i].q;
                ee++;
            }
        }
        sort(c,c+e,cmp);
        sort(d,d+ee,cmp);
        ll num1=0,num2=0;
        //num1是记录c数组中1的个数,mum2是记录d数组中一的个数
        ll ans=0;
        for(i=0;i<e;i++)
        {
            if(c[i].q==1)
            {
                num1++;
            }
            else
            {
                if(num1>0)
                {
                    ans++;
                    num1--;
                }
            }
        }

        for(i=0;i<ee;i++)
        {
            if(d[i].q==1)
                num2++;
            else
            {
                if(num2>0)
                {
                    ans++;
                    num2--;
                }
            }
        }
        printf("%lld\n",ans);
    }
}

猜你喜欢

转载自blog.csdn.net/ZCY19990813/article/details/89310058