♌
Leo
A fire sign duo built on mutual admiration. Leo's regal charm and Aries' pioneering spirit create a powerful, passionate, and playful partnership. Both love excitement and are generous with their affection.
Fiery Passion
♐
Sagittarius
The ultimate adventure buddies. Both are fire signs who crave freedom, optimism, and intellectual exploration. This relationship isacing: 0px; ">T2
| T3 | T1 | T2 |
请问对于给定的N,有多少种可能的排队方式使得每个人的高兴指数最大。
Input
输入文件第一行包含一个整数T,表示测试数据的个数。
对于每组测试数据,第一行包含一个整数N,表示总共有N位同学。
(1<= T <= 10000)
(1 <= N <= 1000000000)
题意:给出两个序列,a和b,现在可以对a进行操作:选择a中的一个元素,将其加一或者减一,问最少需要多少次操作使得a序列和b序列一样。
思路:求对应位置的差值,统计差值为正、负的总和,输出最大的一个即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
int a[100010];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int x;
int s1=0,s2=0;
for(int i=0;i<n;i++){
scanf("%d",&x);
a[i]-=x;
if(a[i]>0)s1+=a[i];
else s2-=a[i];
}
if(s1>s2)printf("%d\n",s1);
else printf("%d\n",s2);
}
return 0;
}G - 01Sequence
题意:有一个01组成的串,给出m个区间,每个区间中1的个数,问满足这些条件的字典序最小的串是什么。
思路:贪心,先按照区间右端点排序,对于每个区间,先判断区间内已有的1的个数,然后从右端点开始向左找0,将其变为1直到满足条件。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int l,r,s;
}p[100010];
int a[100010];
bool cmp(node a,node b){
return a.r<b.r;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
memset(a,0,sizeof(a));
for(int i=0;i<m;i++)
scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].s);
sort(p,p+m,cmp);
for(int i=0;i<m;i++){
int sum=0;
for(int j=p[i].l;j<=p[i].r;j++)
sum+=a[j];
if(sum<p[i].s){
sum=p[i].s-sum;
for(int j=p[i].r;j>=p[i].l;j--){
if(!a[j]){
a[j]=1;
sum--;
}
if(sum==0)break;
}
}
}
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
}
return 0;
}]]>
span style="font-size: 18px; ">
题意:给出一个序列,问最少需要改变多少个数,使得序列变为一个等差数列。思路:暴力枚举公差即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n;
int a[1010];
int b[1010];
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)scanf("%d",&b[i]);
int ans=0;
for(int i=0;i<n;i++){
int s1=0,s2=0;
for(int j=0;j<n;j++){
if(a[j]<=a[i]&&b[j]>=a[i])s1++;
if(a[j]>=a[i]&&b[j]<=a[i])s2++;
}
ans=max(ans,max(s1,s2));
}
printf("%d\n",ans);
}
return 0;
}
J - Zero Game
题意:一个01串,可以移动一个1到0的位置,操作k次,问操作后串中0的个数最少多少。
思路:首先将所有的0都移到一起,然后看剩下的操作数,答案就是这些0的个数减去操作数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1000010];
int a[1000010];
int main(){
int q;
scanf("%d",&q);
while(q--){
int k;
scanf("%s%d",s,&k);
int len=strlen(s);
int cnt=0;
int sum=0;
for(int i=0;i<len;i++){
if(s[i]=='0')a[cnt++]=i;
else sum++;
}
int ans=0;
for(int i=0;i<cnt;i++){
int j=i+cnt-1;
if(j>=cnt)break;
int tmp=a[j]-a[i]+1;
tmp-=cnt;
if(tmp<=k)ans=cnt;
}
if(ans==0)printf("%d\n",sum);
else printf("%d\n",sum+ans);
}
return 0;
}