codeforces 202B Brand New Easy Problem

2014-11-24 11:03:08 · 作者: · 浏览: 0

题目的意思就是说给定不超过四个词的句子,将这几个次进行全排列,然后在去下面给出的例子中进行匹配,如果某个全排列匹配成功的话,就求出其逆序数,找到符合情况的逆序数最小的情况,如果有多的选择,则选择编号最小的情况,并按照给定的格式进行输出。

题目中说到就是子串中的单词不会重复,但是匹配串会有单词重复,如果说去每个匹配串中找到相应的单词,并求出所有可能的逆序的话,这样的任务量会很大。不如就是把子串所有的全排列全部匹配一遍,这样的话会省去很多判断的过程,对于编码和时间都会有很大的改善。

那么这道题的主要思路就是用到next_permutation()函数将子串进行全排列,然后把每种情况的逆序数求出来,然后和匹配串一一匹配,然后再重中找到最终的解。

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       using namespace std; struct node { char s[21][25]; int k; } v[10]; int main() { int n,m,k,f[4]; scanf("%d",&n); char a[4][20]; for(int i=0; i
      
       f[i]) sum++; if(sum>ans) continue; for(i=0; i
       
        =n) break; } if(i
        
         i)) p=i,ans=sum; } while(next_permutation(f,f+n)); if(p==20) printf("Brand new problem!\n"); else { printf("%d\n[:",p+1); int t=n*(n-1)/2+1-ans; for(int i=0; i