给予一个 n ,求三个数a ,b ,c , 范围 1 <= a <= b <=c <= n,要求 a , b ,c能组成三角形,并且 a ^ b ^ c == 0,求符合要去的个数。
循环查找 a , b 然后求出 c , c = a ^ b,然后判断 c 是否符合要求。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int res = 0;
for (int i = 1; i < n; i ++){ // 循环查找
for (int j = i ; j <= n; j ++){
int c = i ^ j; // 求出 c 的值
if (c >= j && i + j > c && c - i < j && c <= n){ // 判断 c 是否符合要求
res ++;
}
}
}
printf("%d\n",res);
return 0;
}
给予 n , k, 求从1 <= i <= k 中 n % i 的值都不同,因此可以循环进行思考,当i = 1时,那么值一定为0 , i = 2 值可以为 0, 1 但是前面用过0,因此只能是 1 ,以此类推,得到结果 n % i 的值为 i - 1。
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
int main(){
ll n , k;
scanf("%lld%lld",&n,&k);
for (ll i = 1; i <= k; i++){
if (n % i != i - 1) {
printf("No\n");
return 0;
}
}
printf("Yes\n");
return 0;
}
给予 n ,然后下面跟 n 个字符串,由s和h 组成,求将 n 个字符串进行连接,求出存在做多子序列 sh 的个数。
首先我们对每个子串求出s, h ,sh 的个数,存入字符串中,然后我们进行贪心排序,对于两个字符串,我们 可以让字符串 a 排在前面 也可以让字符串 b 排在前面。我们应进行比较:
a 在前 => a.sh + b.sh + a.s * b.h > a.sh + b.sh + a.h * b.s 。
否则b 在前。 按此规律进行排序。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
string a[N];
struct solve {
long long h;
long long s;
long long sh;
}ans[N];
bool cmp(solve a,solve b){
return (a.sh + b.sh + a.s * b.h) > (a.sh + b.sh + b.s * a.h);
}
int main(){
int n;
scanf("%d",&n);
for (int i = 0 ; i < n; i++){
cin>>a[i];
for (int j = 0 ; j < a[i].length(); j ++){
if (a[i][j] == 's') ans[i].s ++;
else {
ans[i].sh += ans[i].s;
ans[i].h ++;
}
}
}
sort(ans,ans + n,cmp);
long long ss = 0;
long long res = 0;
for (int i = 0; i < n; i++){
res += ans[i].sh + ans[i].h * ss;
ss += ans[i].s;
}
printf("%lld\n",res);
return 0;
}