zoukankan      html  css  js  c++  java
  • 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    edgnb
     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 int main(){
     6     string s;
     7     cin>>s;
     8     int t=0;
     9     for(int i=0;i<s.size();i++){
    10         if((i+4<s.size())&&s[i]=='e'&&s[i+1]=='d'&&s[i+2]=='g'&&s[i+3]=='n'&&s[i+4]=='b')
    11             t++;
    12     }
    13     cout<<t;
    14     return 0;
    15 }

    看懂题目暴力模拟就行
     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 #define pb push_back
     5 #define int long long
     6 int vis[166],mp[166];
     7 set<int> p;
     8 
     9 signed main(){
    10     string ans="";
    11     int n;
    12     string s;
    13     cin>>n>>s;
    14     for(int i=0;i<s.size();i++){
    15         string u=s;
    16         string t=u.substr(0,i+1);    
    17 //        cout<<i<<" "<<t<<" ";
    18         memset(vis,0,sizeof(vis));
    19         memset(mp,0,sizeof(mp));
    20         p.clear();
    21         for(int j=t.size()-1;j>=0;j--){
    22             if(!mp[t[j]-'a']){
    23                 int q=p.size();
    24                 vis[t[j]-'a']=q;
    25                 mp[t[j]-'a']=1;        
    26             }
    27             p.insert((int)(t[j]-'a'));
    28         }
    29         string cur="";
    30         for(int j=0;j<t.size();j++){
    31             cur=cur+((char)(vis[t[j]-'a']+'a'));
    32         }
    33 //        cout<<cur<<endl;
    34         if(cur>ans) ans=cur;
    35     }
    36     cout<<ans;
    37     return 0;
    38 }

    思路:按每一位进行考虑,因为每一位都是独立的,互不影响。我们就可以对每个联通块(假设大小为N)进行遍历,假设第一个遍历的节点的i位取1,那么如果在符合的情况下就能得到连通块该记为1的数量S,那么就猜个结论:联通块最小1的个数MINX=min(S,N-S)。那么这题就能愉快的AC了!
     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 #define pb push_back
     5 #define int long long
     6 const int N = 2e5+100 ;
     7 int n,m;
     8 int u[N],v[N],w[N],f[N];
     9 int col[N];
    10 int vis[N];
    11 vector<pair<int,int> >g[N];
    12 queue<int> q;
    13 signed main(){
    14     cin>>n>>m;
    15     for(int i=1;i<=m;i++){
    16         cin>>u[i]>>v[i]>>w[i];
    17         g[u[i]].pb({v[i],w[i]});
    18         g[v[i]].pb({u[i],w[i]});
    19     }
    20     //memset(col,-1,sizeof(col));
    21     int ans=0;
    22     for(int j=0;j<=30;j++){
    23         memset(col,-1,sizeof(col));
    24         memset(vis,0,sizeof(vis));
    25         for(int i=1;i<=n;i++){
    26             if(vis[i]) continue;
    27             while(q.size()) q.pop();
    28             q.push(i);
    29             col[i]=0;
    30             int s1=0,tot=0;
    31             int F=1;
    32             while(q.size()){
    33                 int u=q.front();
    34                 q.pop();
    35                 if(vis[u]) continue;
    36                 vis[u]=1;
    37                 tot++;
    38                 for(auto x:g[u]){
    39                     int to=x.first;
    40                     int w=x.second;
    41                     if(col[to]==-1){
    42                         q.push(to);
    43                         if(((1<<j)&w)){
    44                             if(col[u]==0){
    45                                 col[to]=1;
    46                                 s1++;
    47                             }else{
    48                                 col[to]=0;
    49                             }
    50                         }else{
    51                             if(col[u]==1){
    52                                 col[to]=1;
    53                                 s1++;
    54                             }else{
    55                                 col[to]=0;
    56                             }
    57                         }
    58                     }else{
    59                         if((1<<j)&w){
    60                             if(!(col[u]^col[to])){
    61                                 F=0;
    62                                 break;
    63                             }
    64                         }else{
    65                             if((col[u]^col[to])){
    66                                 F=0;
    67                                 break;
    68                             }
    69                         }
    70                     }
    71                 }
    72             }
    73             if(!F){
    74                 cout<<"-1";
    75                 return 0;
    76             } 
    77             ans=ans+min(tot-s1,s1)*(1<<j);
    78         }        
    79     }        
    80     cout<<ans;
    81     
    82     return 0;
    83 }
    84 /*
    85 
    86 */

    先将前面那个变成0000(例如:{1234 2345} ==》{0000 1234}),然后BFS预处理一下。O(1)查询。
     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 #define int long long
     5 string f[]={"0001","0010","0100","1000","1100","0110","0011","1110","0111","1111"};
     6 struct str{
     7     string s;
     8     int sum;
     9 };
    10 queue<str> q;
    11 
    12 map<string,int> mp,vis;
    13 signed main(){
    14     string s="0000";
    15     q.push({s,0});
    16     while(q.size()){
    17         str p=q.front();
    18         q.pop();
    19     //    cout<<"=-="<<endl;
    20         if(mp[p.s]) continue;
    21         mp[p.s]=1;
    22         vis[p.s]=p.sum;
    23         for(int i=0;i<10;i++){
    24             string t=p.s;
    25             for(int j=0;j<4;j++){
    26                 if(f[i][j]=='1'){
    27                     int num=t[j]-'0';
    28                     num++;
    29                     if(num==10) num=0;
    30                     t[j]=(num+'0');
    31                 }
    32             }
    33             //cout<<t<<endl;
    34             q.push({t,p.sum+1});        
    35             t=p.s;
    36             for(int j=0;j<4;j++){
    37                 if(f[i][j]=='1'){
    38                     int num=t[j]-'0';
    39                     num--;
    40                     if(num==-1) num=9;
    41                     t[j]=('0'+num);
    42                 }
    43             }
    44             //cout<<t<<endl;
    45             q.push({t,p.sum+1});
    46         }     
    47     }
    48     int T=1;
    49     cin>>T;
    50     while(T--){
    51         string s,t;
    52         cin>>s>>t;
    53         string u="";
    54         for(int i=0;i<4;i++){
    55             int x=s[i]-'0';
    56             int y=t[i]-'0';
    57             if(x==y){
    58                 u+="0";
    59             }else if(x<y){
    60                 int cha=y-x;
    61                 u+=(cha+'0');
    62             }else{
    63                 int cha=y-x+10;
    64                 u+=(cha+'0');
    65             }
    66         } 
    67         cout<<vis[u]<<endl;
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    以UIWebView的方式来播放网络多媒体档案
    Cocoa.Programming.for.Mac系统文章翻译
    iOS开发教程:Storyboard全解析第二部分
    boost日期、时间操作
    使用thrift大量编译警告消息方法
    一键自动往crontab添加条目脚本
    apache thrift的不足
    将Fedora 18 LXDE安装到U盘和进入图形界面的方法
    boost库thread.hpp编译警告(type attributes are honored only at type definition)已修复
    平板电视必知知识
  • 原文地址:https://www.cnblogs.com/pengge666/p/15594980.html
Copyright © 2011-2022 走看看