zoukankan      html  css  js  c++  java
  • UVA-1592 Database

    第一篇文章,以后会坚持写的。
    这道题目就是找r1,r2,c1,c2使得(r1,c1)和(r2,c1)相等,(r1,c2)和(r2,c2)相等
    对效率有一定要求,不小心就会TLE
    最初的算法是枚举r1,r2然后横向扫描,时间复杂度为Θ(n^3)无疑TLE。

    后来经过改进将每个string与处映射成一个数,枚举c1,c2然后从上往下扫描将(r,c1)(r,c2)字符串对应的两个整数
    组合成一个结构体作为map的键值,用r作为value,若键值已存在就为所求。
    注意尽量将string映射成int的值存在一个二维数组中,map查找也是要时间的。
    映射的值也尽量在输入中计算,否则单独计算也是要Θ(n^2)时间

    最后勉勉强强AC了吧,不过效率还是有待改进,rank1 0.2几秒就过了,有空还会改的。
    附代码

     1 #include<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<map>
     5 #include<cstdio>
     6 using namespace std;
     7 struct kv
     8 {
     9     int k;
    10     int v;
    11     kv(int a,int b){
    12         k=a;v=b;
    13     }
    14 };
    15 bool operator < (const kv& a,const kv& b){
    16     if(a.k<b.k)return 1;
    17     if(a.k>b.k)return 0;
    18 
    19     return a.v<b.v;
    20 }
    21 int main()
    22 {
    23     //ios::sync_with_stdio(false);
    24 
    25     int m,n;
    26     while(cin>>n>>m){
    27         getchar();
    28         char line[100];
    29         string s[10020][11];
    30         int a[n][m];
    31         map<string,int> con;
    32         int num=1;
    33 
    34         for(int i=0;i<n;i++){
    35             gets(line);
    36             int c=0;
    37             int len=strlen(line);
    38             for(int j=0;j<len;j++){
    39                 if(line[j]==','){
    40                     c++;
    41                     if(!con.count(s[i][c-1])){
    42                         con[s[i][c-1]]=num++;
    43                         a[i][c-1]=num-1;
    44                     }
    45                     else a[i][c-1]=con[s[i][c-1]];
    46                 }
    47                 else s[i][c].push_back(line[j]);
    48             }
    49             if(!con.count(s[i][c])){
    50                 con[s[i][c]]=num++;
    51                 a[i][c]=num-1;
    52             }
    53             else a[i][c]=con[s[i][c]];
    54         }
    55 
    56         int sign=0;
    57         for(int c1=0;c1<m;c1++){
    58             for(int c2=c1+1;c2<m;c2++){
    59                 map<kv,int> database;
    60                 for(int i=0;i<n;i++){
    61                     kv k(a[i][c1],a[i][c2]);
    62                     if(database.count(k)){
    63                         sign=1;
    64                         cout<<"NO"<<endl;
    65                         cout<<database[k]<<" "<<i+1<<endl;
    66                         cout<<c1+1<<" "<<c2+1<<endl;
    67                         goto ssss;
    68                     }
    69                     else {
    70                         database[k]=i+1;
    71                     }
    72                 }
    73             }
    74         }
    75         ssss:;
    76         if(sign==0)cout<<"YES"<<endl;
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    Task的使用
    WinStore之Application Data
    WinStore控件之Button、HyperlinkButton、RadioButton、CheckBox、progressBar、ScrollViewer、Slider
    WinStore控件之TextBox
    WinStore控件之TextBlock
    WinStore控件之Button
    设计模式之单例模式
    WinStore开发知识导航集锦
    WindowsStore页面导航
    导出程序界面(UI)到图片
  • 原文地址:https://www.cnblogs.com/tooyoungtoosimple/p/4442912.html
Copyright © 2011-2022 走看看