251106 算法

问题 A: C002 赌徒

cpp 复制代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
ll arr[1005];
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        if(n == 0)break;
        for(int i = 0;i < n;i++){
            scanf("%lld",&arr[i]);
        }
        sort(arr,arr + n);
        long long max_winner = -1;
        bool found = false;

        for(int i = n - 1;i >= 0;i--){
            ll target = arr[i];

            for(int j = 0;j < n;j++){
                if(j == i)continue;
                int left = j + 1;
                int right = n - 1;
                while(left < right){
                    if(left == i){
                        left++;
                        continue;
                    }
                    if (right == i) {
                        right--;
                        continue;
                    }
                    ll sum = arr[j] + arr[left] + arr[right];
                    if(sum == target){
                        if(!found || target > max_winner){
                            max_winner = target;
                            found = true;
                        }
                        break;
                    }
                    else if(sum < target){
                        left++;
                    }else{
                        right--;
                    }
                }

                if(found && max_winner == target){
                    break;
                }

        }
        if(found)break;
    }
    if(found){
        cout << max_winner << endl;
    }else{
        cout << "no solution"<< endl;
    }
    }
}
cpp 复制代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
int arr[10005];

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    int max_len = 0;
    for(int i = 0;i < n;i++){
        double temp;
        scanf("%lf",&temp);
        arr[i] = temp * 100;
        if(arr[i] > max_len) max_len = arr[i];
    }

    int left = 1;
    int right = max_len;
    int res = 0;
    while(left <= right){
        int mid = left + (right - left)/2;
        int cnt = 0;
        for(int i = 0;i < n;i++){
            int c = arr[i] / mid;
            cnt += c;
        }
        if(cnt >= k){
            res = mid;
            left = mid + 1;
        }else{
            right = mid - 1;
        }
    }
    double r = (double)res / 100;
    printf("%.2f\n",r);

}
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int x, y;
} Point;


int compare_points(const void *a, const void *b) {
    Point *p1 = (Point *)a;
    Point *p2 = (Point *)b;
    if (p1->x != p2->x) return p1->x - p2->x;
    return p1->y - p2->y;
}


int point_exists(Point *points, int n, Point p) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        int cmp = compare_points(&points[mid], &p);
        if (cmp == 0) return 1;
        if (cmp < 0) left = mid + 1;
        else right = mid - 1;
    }
    return 0;
}

int main() {
    int n;
    while (scanf("%d", &n) == 1 && n != 0) {
        Point *points = (Point *)malloc(n * sizeof(Point));
        for (int i = 0; i < n; i++) {
            scanf("%d %d", &points[i].x, &points[i].y);
        }
        
        
        qsort(points, n, sizeof(Point), compare_points);
        
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int x1 = points[i].x, y1 = points[i].y;
                int x2 = points[j].x, y2 = points[j].y;
                
                
                int dx = x2 - x1, dy = y2 - y1;
                
                
                Point p3 = {x1 - dy, y1 + dx};
                Point p4 = {x2 - dy, y2 + dx};
                if (point_exists(points, n, p3) && point_exists(points, n, p4)) {
                    ans++;
                }
                
                
                Point p5 = {x1 + dy, y1 - dx};
                Point p6 = {x2 + dy, y2 - dx};
                if (point_exists(points, n, p5) && point_exists(points, n, p6)) {
                    ans++;
                }
            }
        }
        
        
        ans /= 4;
        printf("%d\n", ans);
        
        free(points);
    }
    return 0;
}
cpp 复制代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
ll arr[1005];
int main(){
    int z;
    while(scanf("%d",&z) != EOF){
        while(z--){
            ll n;//硬币个数
            scanf("%lld",&n);
            ll sum = 0;
            ll i = 1;
            for(i = 1;sum < n;i++){
                sum += i;
            }
            if(sum == n)cout << i - 1 << endl;
            else{
                cout << i - 2 << endl;
            }
        }
    }
}
相关推荐
前端小白在前进22 分钟前
力扣刷题:复原IP地址
tcp/ip·算法·leetcode
历程里程碑27 分钟前
C++ 17异常处理:高效捕获与精准修复
java·c语言·开发语言·jvm·c++
yaoh.wang34 分钟前
力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路
python·算法·leetcode·面试·职场和发展·二叉树·跳槽
Evand J35 分钟前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉
xu_yule36 分钟前
算法基础(背包问题)—分组背包和混合背包
c++·算法·动态规划·分组背包·混合背包
蓝色汪洋43 分钟前
数码串和oj
数据结构·算法
努力学算法的蒟蒻1 小时前
day39(12.20)——leetcode面试经典150
算法·leetcode·面试
科学最TOP1 小时前
xLSTM-Mixer:基于记忆混合的多变量时间序列预测
大数据·人工智能·算法·机器学习·时间序列
你的冰西瓜1 小时前
C++中的vector容器详解
开发语言·c++·stl
刻BITTER1 小时前
C++ 获取任意整数类型的最大、最小值和长度
开发语言·c++