首页 > 代码库 > Volume 1. Elementary Problem Solving :: Sorting/SearchingUva 340,10420,10474,152,299,120,156,400,755

Volume 1. Elementary Problem Solving :: Sorting/SearchingUva 340,10420,10474,152,299,120,156,400,755

刘汝佳 算法入门 第一版 Uva题目集合(四)




Uva 340

#include<stdio.h>
#include<string.h>
int h[1001][2],g[1001]={0};
int n,m=0,i,j,k,a,b,o;
int main()
{
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    scanf("%d",&n);
    while (n != 0 ){
          m++;
          memset(h,0,sizeof(h));
          printf("Game %d:\n",m);
          for (i=1;i<=n;i++) scanf("%d",&h[i][1]);
          while (o!=n){
                o = 0;
                memset(g,0,sizeof(g));
                for (i=1;i<=n;i++) {
                   scanf("%d",&g[i]); 
                    if (g[i]==0) o++;
                    h[i][2]=0;
                }
                if (o != n){
                      a = 0; b = 0;
                      for (i=1;i<=n;i++){
                          if ( g[i]==h[i][1]) {
                               a++;
                               h[i][2]++;
                          }
                      }
                      for (i=1;i<=n;i++)
                      if (g[i] != h[i][1]){
                               for (k=1;k<=n;k++)
                               if ( g[i]==h[k][1] && h[k][2]==0){
                                    b++;
                                    h[k][2]++;
				    break;
                               }
                      }         
                      printf("    (%d,%d)\n",a,b);
                }      
          }
		  o = 0;
          scanf("%d",&n); 
    }
    return 0;
}
/*
#include<stdio.h>
#include<string.h>
int main()
{
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    int n,i,j,a[1001],b[1001],aa[10],bb[10],now=0;
    while (scanf("%d",&n)==1)
    {
          if (n==0) break;
          printf("Game %d:\n",++now);
          for (i=1;i<=n;i++) scanf("%d",&a[i]);
          while (true)
          {
                for (i=1;i<=n;i++) scanf("%d",&b[i]);
                if (b[1]==0) break;
                int x=0,y=0;
                memset(aa,0,sizeof(aa));
                memset(bb,0,sizeof(bb));
                for (i=1;i<=n;i++) if (a[i]==b[i]) x++; else {aa[a[i]]++;bb[b[i]]++;}
                for (i=1;i<=9;i++) if (aa[i]<bb[i]) y+=aa[i]; else y+=bb[i];
                printf("    (%d,%d)\n",x,y);
          }
    }
    return 0;
}
*/ 


Uva 10420

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void *a, const void *b) {
    char *_a = (char *)a;
    char *_b = (char *)b;

    return strcmp(_a, _b);
}

int main() {
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    char str[2005][80];
    int n;

    scanf("%d", &n);

    for (int i=0; i<n; i++) {
        scanf("%s", str[i]);
        gets(str[i+1]); // 把女人姓名忽略掉
    }

    qsort(str, n, sizeof (str[0]), cmp);

    int tmp = 1;
    for (int i=1; i<=n; i++) {
        if (0==strcmp(str[i], str[i-1]) && i<n) {
            tmp++;
        }
        else {
            printf("%s %d\n", str[i-1], tmp);
            tmp = 1;
        }
    }

    return 0;
}


Uva 10474

#include<stdio.h>
int main(){
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    int n,m,test=0;
    while (scanf("%d%d",&n,&m)==2){
          if (n==0)break;
          printf("CASE# %d:\n",++test);
          int i,x,a[10001]={0},b[10001]={0};
          for (i=1;i<=n;i++) {scanf("%d",&x);a[x]++;}
          for (i=1;i<=10000;i++) b[i]=b[i-1]+a[i];
          for (i=1;i<=m;i++){
              scanf("%d",&x);
              if (a[x]==0) printf("%d not found\n",x);
              else printf("%d found at %d\n",x,b[x-1]+1);
          }
    }
    return 0;
}


Uva152

#include <iomanip>
#include <iostream>
#include <cmath>
using namespace std;
int main(){
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    int i,j,s,s1,x,y,z,n=0;
    int count[10]={0};
    int scan[5010][3];
    while(cin>>scan[n][0]>>scan[n][1]>>scan[n][2]){
        if(!scan[n][0]&&!scan[n][1]&&!scan[n][2])break;
        ++n;
    }
    for(i=0;i<n;i++){
        s=5010;
        for(j=0;j<n;j++){
            if(j!=i){
                x=scan[i][0]-scan[j][0];
                y=scan[i][1]-scan[j][1];
                z=scan[i][2]-scan[j][2];
                s1=(int)sqrt(x*x+y*y+z*z);
                if(s>s1)s=s1;
            }
        }
        if(s>=10)continue;
        count[s]++;
    }
    for(i=0;i<10;i++)
        cout<<setw(4)<<count[i];
    cout<<endl;
    return 0;
}


Uva 299

#include<stdio.h>
int main()
{
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    int a[51],n,i,j,w,min,test,ans;
    scanf("%d",&test);
    while (test--){
          ans=0;
          scanf("%d",&n);
          for (i=1;i<=n;i++) scanf("%d",&a[i]);
          for (i=1;i<n;i++){
              min=2000000000;
              for (j=i;j<=n;j++)
                  if (a[j]<min) {min=a[j];w=j;}
              for (j=w;j>=i+1;j--) a[j]=a[j-1];
              a[i]=min;
              ans+=w-i;
          }
          printf("Optimal train swapping takes %d swaps.\n",ans);
    }
    return 0;
}
/*
#include<stdio.h>
#include<string.h>
int h[10000];
int n,m,k,i,j,a,b;
int main()
{
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    scanf("%d",&n);
    for (k=1;k<=n;k++)
    {
        memset(h,0,sizeof(h));
        a = 0;
        scanf("%d",&m);
        if (m != 0)
        {
              for (i=1;i<=m;i++) scanf("%d",&h[i]);
 
              for (i=1;i<m;i++)
               for (j=i+1;j<=m;j++)
                if ( h[i]>h[j] )
                {
                     b=h[i]; h[i]=h[j]; h[j]=b;
                     a++;
                }
        }
        printf("Optimal train swapping takes %d swaps.\n",a);
    }
    return 0;
}
*/ 


Uva 120

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
 
using namespace std;
 
int Num[31],s[31];
int ans[10001];
 void swap(int n,int *a){
 	for(int f=0;f<n/2;f++){
 			int temp = a[f];
			a[f] = a[n-f-1];
			a[n-f-1] = temp;
 	}
 } 
bool cmp(const int ta, const int tb){
	return ta>tb;
}
int main(){
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
	int a,i=0,j,k,f; 
	int ct = 0,temp;
	char ch;
	while(scanf("%d%c",&a,&ch)!=EOF){
		s[i] = Num[i] = a;
		i++; 
		printf("%d ",a);
		if(ch == '\n'){
			printf("\n");
			sort(Num,Num+i,cmp);
			for(j = 0; j<i; j++){
				for(k = 0; k<i; k++){
					if(s[k] == Num[j] && k!=i-1-j){
						if(k == 0){
							ans[ct++] = j+1;
							swap(i-j,s);
						}
						else {
							ans[ct++] = i-k;
							swap(k+1,s);
							ans[ct++] = j+1;
							swap(i-j,s);
						}
					}
				}
			}
			j = ans[ct] = 0;
			i = ct = 0;
			while(ans[j]){
				printf("%d ",ans[j]);
				j++;
			}
			printf("0\n");
		}
	}
	return 0;
}/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void *_a, const void *_b) {
    int* a = (int *)_a;
    int* b = (int *)_b;

    return *a - *b;
}

void swap(int a[], int i, int j) {
    while (i < j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        i++;
        j--;
    }
}

int main() {

    int a[35], b[35], n;


    while (scanf("%d", &a[0]) != EOF) {
        // 接收输入的数字
        n = 1;
        if (getchar() != '\n')
            while (scanf("%d", &a[n++]))
                if (getchar() == '\n')  break;

        // 输出原先的序列并复制一份给b数组
        for (int i=0; i<n; i++) {
            b[i] = a[i];
            printf("%d ", a[i]);
        }
        printf("\n");

        // 对b数组进行排序
        qsort(b, n, sizeof (int), cmp);

        // 从后往前遍历a数组
        for (int i=n-1; i>=0; i--) {
            // 如果a[i]的值在排好序的位置就不执行下面的for循环
            if (a[i] == b[i])   continue;
            for (int j=i-1; j>=0; j--) {
                // 如果a[i]的值与位置不符就从前面找到该位置的数
                if (b[i] == a[j]) {
                    // 如果该数在第0个位置就直接交换
                    if (j == 0) {
                        printf("%d ", n - i);
                        swap(a, 0, i);
                    }
                    // 如果不在第0个位置就先交换到第0位置再交换到相应位置
                    else {
                        printf("%d ", n - j);
                        swap(a, 0, j);
                        printf("%d ", n - i);
                        swap(a, 0, i);
                    }
                }
            }
        }

        printf("0\n");
    }

    return 0;
}
*/


Uva 156

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
struct pack
{
       char dat[25], r[25];
       pack()
       {
           memset(dat, '\0', sizeof(dat));
           memset(r, '\0', sizeof(r));
       }
 
       bool operator < (pack const y) const
       {
            return strcmp(dat, y.dat) == -1;
       }
};
pack a[1005];
char store[1005][25];
bool checked[1005];
int sort_function( const void *a, const void *b){
   return( strcmp((char *)a,(char *)b) );
}
int main(){
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
   int i, j, k = 0, n = 0, ck;
   while(cin >> a[k].dat && strcmp(a[k].dat,"#")){
     for(i = 0; i < strlen(a[k].dat); i++)
        a[k].r[i] = tolower(a[k].dat[i]);
     sort(a[k].r, a[k].r + strlen(a[k].dat));
     k++;
   }
   //sort(a, a + k);//显然这句话可以不加
   for(i = 0; i < k; i++){
      if(checked[i])  
        continue ;
      for(j = i + 1; j < k; j++)
         if(strcmp(a[i].r, a[j].r) == 0)
           checked[i] = checked[j] = 1;
      if(!checked[i])
        strcpy(store[n++], a[i].dat);
   }
   qsort((void *)store, n, 25, sort_function);
   for(i = 0; i < n; i++)
      cout << store[i] << endl;
   return 0;
} 


Uva 400

#include<iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    int n, i, j, leng, column, row;
    string a[101];
    while(cin >> n){
         leng = -1;
         for(i = 0; i < n; i++){
            cin >> a[i];
            leng = max((int)a[i].length(), leng);
         }
         column = 60/(leng + 2);
         if(column == 0)
           column = 1;
         row = (int)n/column;
         if(n%column)
           row++;
         sort(a, a + n);
         cout << "------------------------------------------------------------" << endl;
         for(i = 0; i < row; i++) {
            for(j = 0; j < column; j++){
               if(j*row + i >= n)
                 break;
               if(j != column - 1)
                 cout << setw(leng + 2) << setiosflags(ios::left) << a[j*row + i];
               else
                   cout << setw(leng) << setiosflags(ios::left) << a[j*row + i];
            }
            cout << endl;
         }
    }
    return 0;
}


Uva 755

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char m[]="22233344455566677778889999";
char p[100000][9],buf[1000];
int i,j,k,count,duplicate;
int cmp(const void *a,const void *b){
    char *x,*y;
    x=(char*)a;
    y=(char*)b;
    return strcmp(x,y);
}
int main(){
#ifndef ONLINE_JUDGE  
    freopen("input.txt","r",stdin);  
    freopen("output.txt","w",stdout);  
#endif
    int n;
    int kcase;
    scanf("%d",&kcase);
    while(kcase--){
	    scanf("%d\n",&n);
	    for(i=0;i<n&&gets(buf);i++){
	
	       for(k=j=0;buf[j];++j){
	            if(buf[j]=='-') continue;
	            if(buf[j]>='A'&&buf[j]<='Z'){
	                p[i][k]=m[buf[j]-'A'];
	            }
	            else if(buf[j]>='0'&&buf[j]<='9'){
	                p[i][k]=buf[j];
	            }
	            if(++k==3) p[i][k++]='-';
	        }
	     }
	     qsort(p,n,9,cmp);
	     duplicate=0;
	     count=0;
	     for(i=0;++i<=n;){
	         ++count;
	         if(strcmp(p[i-1],p[i])){
	             if(count>1){
	                 printf("%s %d\n",p[i-1],count);
	                 duplicate=1;
	             }
	             count=0;
	         }
	     }
	     if(duplicate==0)
	        puts("No duplicates.");
		if(kcase) printf("\n");
	}
     return 0; 
}