A题
题意:将给出的一组数全转化成二进制,比较每一位出现1或0的次数,如果某一位1出现的次数多,那么记为1,否则记为0,从而组成一个新的数,就是结果。
代码如下:
#include<stdio.h>
#include<math.h>
int main(){
int t;
scanf("%d", &t);
while(t--){
int n, l;
scanf("%d%d", &n, &l);
int a[110];
int one[40] = {0};
int two[40] = {0};
for(int i = 0; i < n; i++){
int k = l - 1;
scanf("%d", &a[i]);
while(a[i] >= 0 && k >= 0){
if(a[i] % 2 == 1){
one[k]++;
}else{
two[k]++;
}
a[i] = a[i] / 2;
k--;
}
}
int m = 0;
int ans = 0;
for(int i = l - 1; i >= 0; i--){
if(one[i] == 0 && two[i] == 0){
break;
}
ans += (one[i] > two[i] ? 1 : 0) * pow(2, m);
m++;
}
printf("%d\n", ans);
}
return 0;
}
B题
结果是:n - 相同的且距离最近的两个数的位置差
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int t;
scanf("%d", &t);
while(t--){
int n;
scanf("%d", &n);
int a[n];
int ans = 150001;
int cnt[150001] = {0};
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
if(cnt[a[i]] != 0){
if(cnt[a[i]] == -1){
ans = min(ans, i);
}else{
ans = min(ans, i - cnt[a[i]]);
}
}
if(i == 0){
cnt[a[i]] = -1;
}else{
cnt[a[i]] = i;
}
}
if(ans == 150001){
printf("-1\n");
}else{
printf("%d\n", n - ans);
}
}
}
C题
题意:
这是一道dp,不太会,
沾一下大佬代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 505;
int a[N];
int v[N];
int dp[N][N];
// i : 到达第几个位置,j : 减少标志数。
//dp[i][j] -> dp[i+t+1][j+t], dp[i+t+1][j+t] = dp[i][j] + (a[i+t+1] - a[i]) * v[i]
inline void solve(){
int n, l, k;
cin >> n >> l >> k;
for (int i=0; i<n; i++){
cin >> a[i];
}
for (int i=0; i<n; i++){
cin >> v[i];
}
memset(dp, 0x3f3f3f, sizeof(dp));
a[n] = l;
for (int i=0; i<=k; ++i){
dp[0][i] = 0;
}
for(int j=0; j<=k; j++){
for(int i=0; i<=n; i++){
for(int t=0; i + t + 1 <= n && t + j <= k; t++){
dp[i+t+1][j+t] = min(dp[i+t+1][j+t], dp[i][j] + (a[i+t+1] - a[i]) * v[i]);
}
}
}
int ans = dp[n][0];
for(int i=1; i<=k; i++){
ans = min(ans, dp[n][i]);
}
cout << ans << endl;
}
int main(){
ios::sync_with_stdio(false);
int t = 1;
while (t--) {
solve();
}
return 0;
}
自己用递归写了一下,虽然可以运行出来,但是会超时
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int c[600],d[600];
int l;
//现在的数组,所需时间
int coutTime(int a[], int b[], int n){
int cnt = 0;
for(int i = 0; i < n - 1; i++){
cnt += b[i] * (a[i + 1] - a[i]);
}
cnt += (l - a[n - 1]) * b[n - 1];
return cnt;
}
void deleteA(int a[], int index, int n){
for(int i = 0; i < n; i++){
if(i < index){
c[i] = a[i];
}
if(i == index){
continue;
}
if(i > index){
c[i - 1] = a[i];
}
}
}
void deleteB(int b[], int index, int n){
for(int i = 0; i < n; i++){
if(i < index){
d[i] = b[i];
}
if(i == index){
continue;
}
if(i > index){
d[i - 1] = b[i];
}
}
}
//去掉i之后所需的时间和不去掉i所需的时间比较。
int process(int k, int a[], int b[], int n){
if(k <= 0){
return coutTime(a, b, n);
}
int ans = coutTime(a, b, n);
for(int i = 1; i < n; i++){
deleteA(a, i, n);
deleteB(b, i, n);
int z = process(k - 1, c, d, n - 1);
ans = min(z, ans);
}
return ans;
}
int main(){
int n, k;
int a[600], b[600];
scanf("%d%d%d", &n, &l, &k);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(int i = 0; i < n; i++){
scanf("%d", &b[i]);
}
printf("%d\n", process(k, a, b, n));
return 0;
}