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;
            }
        }
    }
}
相关推荐
uesowys2 小时前
华为OD算法开发指导-简易内存池
java·算法·华为od
Greedy Alg2 小时前
LeetCode 155. 最小栈
算法
卡提西亚3 小时前
C++笔记-24-文件读写操作
开发语言·c++·笔记
雾岛听蓝3 小时前
算法复杂度解析:时间与空间的衡量
c语言·数据结构·经验分享·笔记
m0_748248023 小时前
C++ 异常处理全解析:从语法到设计哲学
java·c++·word
小白程序员成长日记3 小时前
2025.11.08 力扣每日一题
算法·leetcode·职场和发展
Nebula_g3 小时前
C语言应用实例:学生管理系统1(指针、结构体综合应用,动态内存分配)
c语言·开发语言·学习·算法·基础
小叮当⇔3 小时前
“征服式学习”提示词工具箱
学习·算法
惊讶的猫3 小时前
字符串- 字符串转换整数 (atoi)
数据结构·算法