zoukankan      html  css  js  c++  java
  • Codeforces#364Div2

    A题:

    题意:给定一些数,然后每两个组成一对,要求每对的和的大小相同,输出这样的组合

    分析:直接模拟就行

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=110;
    15 int a[maxn];
    16 int n;
    17 int vis[maxn];
    18 int main()
    19 {
    20     while(cin>>n)
    21     {
    22         int sum=0;
    23         for(int i=1;i<=n;i++)
    24         {
    25             cin>>a[i];
    26             sum+=a[i];
    27         }
    28         memset (vis,0,sizeof(vis));
    29         int ave=n/2;
    30         int num=sum/ave;
    31         for(int i=1;i<=n;i++){
    32             if(!vis[i]){
    33                 for(int j=1;j<=n;j++){
    34                     if(!vis[j]&&j!=i){
    35                         if(a[i]+a[j]==num){
    36                             vis[i]=1; vis[j]=1;
    37                             cout<<i<<" "<<j<<endl;
    38                             break;
    39                         }
    40                     }
    41                 }
    42             }else continue;
    43         }
    44     }
    45     return 0;
    46 }
    View Code

    B题:

    题意:给定n*n的方格,有m个操作,每个操作给定两个坐标系x,y,去掉x行和y列,问每一步操作之后剩下多少

    分析:每一步操作就是(n-当前被去掉的行)*(n-当前被去掉的列)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=100010;
    15 long long d[maxn];
    16 long long n,m;
    17 //int visrow[maxn],viscol[maxn]; //行和列
    18 int main()
    19 {
    20     while(cin>>n>>m)
    21     {
    22         memset(d,0,sizeof(d));
    23         set<long long > row; //
    24         set<long long> col;  //
    25         long long cnt=n*n;
    26         for(int i=0;i<m;i++)
    27         {
    28             long long  x,y;
    29             cin>>x>>y;
    30             row.insert(x);
    31             col.insert(y);
    32             int num1=row.size();
    33             int num2=col.size();
    34             long long sum=(n-num1)*(n-num2);
    35             d[i]=sum;
    36         }
    37         for(int i=0;i<m-1;i++){
    38             cout<<d[i]<<" ";
    39         }
    40         cout<<d[m-1]<<endl;
    41     }
    42     return 0;
    43 }
    View Code

    C题:

    题意:求包含所有字母的最短子串长度

    分析:对于尚未取到所有字母的位置,不断更新,对于取到了所有字母的位置,用最大位置的减去最小位置,然后去最小值

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=110;
    15 const int INF=1<<20;
    16 int vis[maxn];
    17 int vis1[maxn],pos[maxn];
    18 string s;
    19 int n;
    20 int main()
    21 {
    22         cin>>n;
    23         cin>>s;
    24         //
    25         memset(vis,0,sizeof(vis));
    26         string match;
    27         for(int i=0;i<n;i++){
    28             if(!vis[s[i]-'A']){
    29                 match+=s[i];
    30                 vis[s[i]-'A']=1;
    31             }
    32         }
    33         //cout<<match<<endl;
    34 
    35         int len=match.length();
    36         int flag=0;
    37         //int vis1[maxn];
    38         //int pos[maxn];
    39         int minx=INF;
    40         memset(vis1,0,sizeof(vis1));
    41         memset(pos,-1,sizeof(pos));
    42         for(int i=0;i<n;i++)
    43         {
    44             for(int j=0;j<len;j++){
    45                 if(s[i]==match[j]){
    46                     vis1[j]=1;
    47                     pos[j]=i; break;
    48                 }
    49             }
    50             int cnt=0;
    51             for(int j=0;j<len;j++){
    52                 if(flag)  break;
    53                 else{
    54                     if(vis1[j])  cnt++;
    55                 }
    56             }
    57             if(cnt==len){
    58                  flag=1;
    59             }
    60             if(flag){
    61                 int mix=pos[0],maxx=pos[0];
    62                 for(int j=1;j<len;j++){
    63                     if(pos[j]<mix)
    64                         mix=pos[j];
    65                     else if(pos[j]>maxx)
    66                         maxx=pos[j];
    67                 }
    68                 int t=maxx-mix;
    69                 minx=min(t,minx);
    70             }
    71         }    
    72         cout<<minx+1<<endl;
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    用C#发邮件
    .Net WinForm datagridview中无法输入中文总结
    6、linux上安装kafka
    10、linux上安装hive
    8、linux上安装hbase
    4、linux 上安装mysql
    3、hadoop的分布式安装
    12、Ambari 环境搭建
    mybtais获取插入数据的主键id
    mybatis高级映射
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5699940.html
Copyright © 2011-2022 走看看