版权声明:转载时 别忘了注明出处 https://blog.csdn.net/ZCY19990813/article/details/89310058
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;
}
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;
}
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);
}
}