题意:两个长度为n的序列,每个数字各不相同,求一种排列方式,使ai+bi的值不同
#include
using namespace std;
const int N = 1010;
int a[N],b[N];
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin>>m;
while(m--)
{
cin>>n;
for(int i = 1;i <= n;i++)cin>>a[i];
for(int i = 1;i <= n;i++)cin>>b[i];
sort(a+1,a+n+1);
sort(b+1,b+n+1);
for(int i = 1;i <= n;i++)cout<
题意:每次可以删除其形如 ()
或 (())
等形式的子串,子串可以不连续,求最少操作多少次,以及操作方案,使括号序列不再包含这样形式的子串。
思路:
我们可以用双指针,左指针以左括号为结束条件,右指针以右括号为结束条件
从前扫遇到’)’ i++;
从后扫遇到’(’ j–;
这里我用a[ ]表示操作
#include
using namespace std;
const int N = 1010;
char s[N];
int a[N];
int sum = 0;
int flag = 0;
int main()
{
scanf("%s",s+1);
int n = strlen(s+1);
for(int i = 1;i <= n;i++)
{
if(s[i] == '(')
{
a[i] = 1;
}
if(s[i] == ')')
{
a[i] = 2;
}
}
int i = 1,j = n;
while(1)
{
while(i <= j && (a[i] == 2))i++;
while(i <= j && (a[j] == 1))j--;//注意这里
if(i >= j)break;
a[i] = a[j] = -1;
flag = true;
sum += 2;
i++,j--;
}
if(flag)
{
printf("1\n%d\n",sum);
for(int i = 1;i <= n;i++)
if(a[i] == -1)printf("%d ",i);
}
else {printf("0\n");}
return 0;
}
题意:给定一个数组,让你求所有元素两个之间差的绝对值的乘积,最后mod m
经典数学题
小学奥数有个叫抽屉原理
就是说
如果有n个数(n>m),必定有两个数是同模的。
也就是说必定有两个数对m取模值是相同的。
证明
对m取模以后,剩下的数是0,1,2,3,4,m-2,m-1,一共只有m种情况,如果有m+1个数,那必定有两个数是同模的。
我们再回过头看这个题,很容易发现,当(n>m)的时候,必定有两个数同模,也就是说这两个数相减以后肯定是m的倍数,如果是m的倍数,那最终结果对m取模肯定是0
#include
using namespace std;
const int N = 1e7+10;
#define ll long long
const int MOD = 1e9+10;
int n,m;
ll a[N];
int main()
{
cin>>n>>m;
for(int i = 1;i <= n;i++)
{
cin>>a[i];
}
if(n > m)
{
cout<<"0"<
交互题
构造题
题意:
给定数字n和m。让我们构造出一个大小为n的正整数数组ans。有两个条件: