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
原文地址:https://www.cnblogs.com/wolf940509/p/5699940.html