7道cf rating1600

这篇博客详细介绍了七个编程挑战,包括A Winner的模拟策略,B Cinema Cashier的暴力与DP解法,C Hierarchy的问题分析,D Triangle的解决思路,E Bargaining Table寻找最大子矩阵的方法,F Party的图论构造问题,以及G pSort的连续交换与排序策略。通过对每个问题的深入剖析,展示了不同的解题技巧和思维过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述

A Winner

模拟

先找最大值,
然后看有几个能达到这个最大值的,记录下来
只有一个,就输出它
有多个,再重新扫一遍,
看这几个,谁先到达这个值

B Cinema Cashier

暴力(可以写成dp)
全部暴力,找最小
dp: 我们发现要反复扫这个矩阵,不难想要用对于每个 i–j --m 记录下来

dp[i][j][m]表示在i,从j放m个人 ,可以从m-1 转移过来
在这里插入图片描述

#include <algorithm>
#include <iostream>
#include <queue>
#include<map>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include <cstring>
#include<cmath>
#include <cstdio>
#define ms(a,b) memset(a, b, sizeof a)
#define _for(i,a,b) for(int i=a;i<b;i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define sc1(a) scanf("%d", &a)
#define sc2(a,b) scanf("%d%d", &a,&b)
#define sc3(a,b,c) scanf("%d%d%d", &a,&b,&c)
#define PII pair<double,int>
using namespace std;
const int N = 100, INF = 0x3f3f3f3f;
int n,k;
bool g[N][N];


int Mid;
int con(int x,int y,int m){
   int sum=0; For(j,y,y+m-1)sum+=abs(x-Mid)+abs(j-Mid);return sum;}
void ji(int x,int y,int m){
   For(j,y,y+m-1)g[x][j]=1;}
bool pj(int x,int y,int m){
   For(j,y,y+m-1)if(g[x][j])return 1;return 0;}
int x,yl,yr;
void find_(int m){
   
    //1.遍历 ,判断,计算,找最小
    x=yl=yr=-1;
    int Min=INF;

    For(i,1,k){
   
        For(j,1,k-m+1){
   
            if(pj(i,j,m))continue;
            int sum=con(i,j,m);
            if(sum<Min){
   
                Min=sum;
                x=i,yl=j,yr=j+m-1;
            }
        }
    }
    if(x!=-1)ji(x,yl,m);
}

int main(){
   
	cin>>n>>k;
	Mid=k/2+1;
	_for(i,0,n){
   

        int m;cin>>m;
        find_(m);  //找m放在哪最小
        if(x!=-1){
   
            printf("%d %d %d\n",x,yl,yr);
        }
        else cout<<-1<<endl;
	}
}


C Hierarchy

稍微找找,就会发现,满足条件的情况,有n-1个入度为1的点


#include <algorithm>
#include <iostream>
#include <queue>
#include<map>
#include <set>
#include <stack></
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UserCF(User-based Collaborative Filtering)是一种基于用户的协同过滤算法,用于推荐系统中的个性化推荐。Python可以使用以下步骤实现UserCF算法: 1. 数据准备:首先,需要准备用户-物品评分矩阵,该矩阵记录了用户对物品的评分情况。 2. 相似度计算:计算用户之间的相似度,常用的相似度计算方法有余弦相似度、皮尔逊相关系数等。可以使用Python中的numpy或scipy库来计算相似度。 3. 邻居选择:根据用户之间的相似度,选择与目标用户最相似的K个邻居。 4. 推荐物品生成:根据邻居的评分情况,预测目标用户对未评分物品的评分,并按照评分高低进行推荐。 下面是一个简单的Python代码示例,演示了如何实现UserCF算法: ```python import numpy as np # 用户-物品评分矩阵 ratings = np.array([ [5, 3, 0, 1], [4, 0, 4, 4], [1, 1, 0, 5], [0, 0, 4, 0], [2, 2, 1, 0] ]) # 计算用户之间的相似度(余弦相似度) def cosine_similarity(user1, user2): dot_product = np.dot(user1, user2) norm1 = np.linalg.norm(user1) norm2 = np.linalg.norm(user2) return dot_product / (norm1 * norm2) # 邻居选择 def select_neighbors(user, ratings, k): similarities = [] for i in range(len(ratings)): if i != user: similarity = cosine_similarity(ratings[user], ratings[i]) similarities.append((i, similarity)) similarities.sort(key=lambda x: x, reverse=True) return similarities[:k] # 推荐物品生成 def generate_recommendations(user, ratings, neighbors): recommendations = {} for i in range(len(ratings[user])): if ratings[user][i] == 0: total_similarity = 0 weighted_sum = 0 for neighbor, similarity in neighbors: if ratings[neighbor][i] != 0: total_similarity += similarity weighted_sum += similarity * ratings[neighbor][i] if total_similarity != 0: recommendations[i] = weighted_sum / total_similarity return recommendations # 示例使用 user = 0 k = 2 neighbors = select_neighbors(user, ratings, k) recommendations = generate_recommendations(user, ratings, neighbors) print("推荐物品:") for item, rating in recommendations.items(): print(f"物品 {item},预测评分:{rating}") ``` 这是一个简单的UserCF算法实现示例,实际应用中可能需要考虑更多的因素和优化策略。相关问题如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值