算法入门系列之排序与检索

UVA340

 

UVA10420

时间有点久远,很早之前写的,然后忘记总结了,这道题其实很容易,一行只取第一个字符串,然后按照字典序输出每个字符串的个数。

这里有个技巧就是先用scanf获取第一个字符串,然后再用gets直接吸收剩下的字母。其次就是用map记录个数,然后用迭代器输出结果

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
map<string,int> ma;
char a[100];
char str[100];
int n;
//同一行字符串,如果只用最前面的一个词,可以先用scanf,然后用gets
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",str);
        gets(a);
        ++ma[str];
    }
    map<string,int> ::iterator iter;
    for(iter=ma.begin();iter!=ma.end();iter++){
        cout<<iter->first<<" "<<iter->second<<endl;
    }
return 0;
}

UVA10420

UVA10474

水题

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[10000],x[10000];
int m,n,k;
int main(){
    int num=0;
    while(scanf("%d%d",&m,&n)!=EOF&&m!=0&&n!=0){
            memset(a,0,sizeof(a));
            num++;
        for(int i=1;i<=m;i++){
            scanf("%d",&x[i]);
        }
        sort(x+1,x+m+1);
        for(int i=1;i<=m;i++){
            if(a[x[i]]==0)
            a[x[i]]=i;
        }
       /* for(int i=1;i<=m;i++){
            cout<<a[i]<<endl;
        }*/
        cout<<"CASE# "<<num<<":"<<endl;
        for(int i=1;i<=n;i++){
            scanf("%d",&k);
            if(a[k]==0)cout<<k<<" not found"<<endl;
            else cout<<k<<" found at "<<a[k]<<endl;
        }
    }
return 0;
}

UVA10474

UVA152

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
double a[5001],b[5001],c[5001];
int sum[10];
double distances(int x,int y){
    double res=(a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y])
    *(b[x]-b[y])+(c[x]-c[y])*(c[x]-c[y]);
    return sqrt(res);
}
void call(int len){
    double distsum;
    for(int i=0;i<len;i++){
            distsum=10;
        for(int j=0;j<len;j++){
                if(i==j)continue;
            double dist=distances(i,j);
            if(dist<distsum)distsum=dist;
        }
        sum[(int)distsum]++;
    }
}
int main(){
    freopen("x.txt","r",stdin);
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    int i=0;
    while(scanf("%lf%lf%lf",&a[i],&b[i],&c[i])!=EOF){
        if(a[i]==0&&b[i]==0&&c[i]==0){
            call(i);
            break;
        }else i++;
    }
    for(int i=0;i<10;i++){
        printf("%4d",sum[i]);
    }
    printf("\n");
return 0;
}

UVA152

UVA299

冒泡排序

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10005];
int n,m;
void sorts(int n){
    int sum=0;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(a[i]>a[j]){
                    swap(a[i],a[j]);
                    sum++;
            }
        }
    }
    printf("Optimal train swapping takes %d swaps.\n",sum);
}
 int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&m);
        for(int i=0;i<m;i++){
            scanf("%d",&a[i]);
        }
        sorts(m);
    }
 }

UVA299

UVA755

水题

注意一点该题可以将字符串转化为一个7位的数字进行比较,然后按照格式输出即可。

格式需要注意的是,取除数,求余数字可能不是对应的位数,所以需要使用setfill,和setw两个函数,前者是填充的字符是什么,后者是填充的位数。

#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iomanip>
using namespace std;
map<int,int> ma;
char s[100];
//前导0!
int call(char* s){
    int num=0;
    int len=strlen(s);
    for(int i=0;i<len;i++){
        if(s[i]==‘A‘||s[i]==‘B‘||s[i]==‘C‘){
            num=num*10+2;
        }else if(s[i]==‘D‘||s[i]==‘E‘||s[i]==‘F‘){
            num=num*10+3;
        }else if(s[i]==‘G‘||s[i]==‘H‘||s[i]==‘I‘){
            num=num*10+4;
        }else if(s[i]==‘J‘||s[i]==‘K‘||s[i]==‘L‘){
            num=num*10+5;
        }else if(s[i]==‘M‘||s[i]==‘N‘||s[i]==‘O‘){
            num=num*10+6;
        }else if(s[i]==‘P‘||s[i]==‘R‘||s[i]==‘S‘){
            num=num*10+7;
        }else if(s[i]==‘T‘||s[i]==‘U‘||s[i]==‘V‘){
            num=num*10+8;
        }else if(s[i]==‘W‘||s[i]==‘X‘||s[i]==‘Y‘){
            num=num*10+9;
        }else if(s[i]<=‘9‘&&s[i]>=‘0‘){
            num=num*10+(s[i]-‘0‘);
        }
    }
    return num;
}
int main(){
    int n,m;
    //freopen("x.txt","w",stdout);
    scanf("%d",&n);
        for(int i=0;i<n;i++){
                ma.clear();
            scanf("%d",&m);
            for(int j=0;j<m;j++){
                scanf("%s",s);
               ma[call(s)]++;
            }
            int flag=0;
            for(map<int,int>::iterator iter=ma.begin();iter!=ma.end();++iter){
                if(iter->second!=1){
                    flag=1;
                    int x=iter->first;
                cout<<setfill(‘0‘)<<setw(3)<<x/10000;
                cout<<‘-‘;
                cout<<setfill(‘0‘)<<setw(4)<<x%10000;
                    cout<<" "<<iter->second<<endl;
                }
            }
            if(flag==0) cout<<"No duplicates."<<endl;
            if(i!=n-1)cout<<endl;
        }

return 0;
}

UVA755

原文地址:https://www.cnblogs.com/Yvettey-me/p/5330313.html

时间: 2024-09-30 14:57:22

算法入门系列之排序与检索的相关文章

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页

这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选和分页 原文:Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但你可以在你的网站上添加到该教程的链接. 在之前的教程中你实现了一组使用Web页面

排序算法入门之选择排序-Java实现

本文参考http://blog.csdn.net/m0_37568091/article/details/78023705 选择排序是先从对象数组中选出最小的放在第一个位置,再从剩下的元素中选择次小的放在第二个位置,以此类推...这里以数组排序实现. public static void chooseSort(int[] a){ for(int i=0;i<a.length;i++){ //假设最小值下标是i int min=i; //依次找出最小值 for(int j=i+1;j<a.len

优化算法入门系列文章目录(更新中):

1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1     二. 模拟退火(SA,Simulate

排序算法入门之希尔排序(java实现)

希尔排序是对插入排序的改进.插入排序是前面元素已经有序了,移动元素是一个一个一次往后移动,当插入的元素比前面排好序的所有元素都小时,则需要将前面所有元素都往后移动.希尔排序有了自己的增量,可以理解为插入排序的增量为1,希尔排序增量是gap.代码就是在插入排序代码的基础上多了一层增量变化的循环.可以参考http://www.cnblogs.com/chengxiao/p/6104371.html,博主作了详尽介绍. public static void shellSort(int[] a){ in

算法入门系列1:k-means

k-means是一种无监督学习算法,用于聚类. 下图(来自http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html)展示了k-means算法k=2时的聚类过程. 第一步:给定k个中心点,然后依次遍历所有数据点,计算每个数据点到k个中心点的距离,距离最短的就归为该中心点 第二步:利用在第一步的结果重新计算中心点 第三步:循环第一第二步直到k个中心点不再变化.

算法入门系列2:k近邻算法

用官方的话来说,所谓K近邻算法(k-Nearest Neighbor,KNN),即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中.这是一个有监督的学习算法 例如下图,红色和蓝色代表已知的训练好的的数据,这个时候来一个示例,也就是图中的绿色圆块,这个绿色圆块属于哪一类呢? 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,

[转] 使用 MVC 5 的 EF6 Code First 入门 系列

译文:http://www.cnblogs.com/Bce-/category/573301.html 原文:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application 共12篇,值得学习学习. PS:肯为自己的译文加上个[渣]字的,质量都不会差到哪去.

第二章 算法入门 合并排序

在第二章中难的算法不多,接下来我会把稍微复杂一点的算法整理一下 #include <iostream> using namespace std; void mergeSort(int *A,int left,int mid,int right) { int *L=new int[mid-left+1]; int *R=new int[right-mid+1]; int i,j; for(i=0;i<mid-left+1;i++) { L[i]=A[left+i]; } for (j=0;

【常用算法思路分析系列】排序高频题集

最近在牛客上整理常用的一些算法思路,[常用算法思路分析系列]主要是针对一些高频算法笔试.面试题目的解题思路进行总结,大部分也给出了具体的代码实现,本篇文章是对排序相关题目的思路分析. 1.简单分类 首先对一些常用算法按空间复杂度进行分类如下: O(1): 冒泡排序.选择排序.插入排序.希尔排序.堆排序 O(logN)~O(N): 快速排序 O(N): 归并排序 O(M): 计数排序.基数排序 2.对一个基本有序的有序的数组排序,选择哪种排序算法? 基本有序:指如果把数组排好序的话,每个元素移动的