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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM