Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)

一笑奈何 提交于 2020-03-06 06:20:48

A. Unimodal Array 题目链接:点击

题意:给定一个数组 问这个数组是不是先严格上升然后恒定然后严格下降 

根据样例可以推测 这三个过程是可以只存在部分过程 例如【1,2,2】【2,2,1】【1,2,1】【1,1,1】均为符合要求的。

瞎搞

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;
 8     cin>>n;
 9     int a[123];
10     for(int i=0;i<n;i++)
11     {
12         cin>>a[i];
13     }
14     int ans = 0;
15     int cnt = 0;
16     for(int i=1;i<n;i++)
17     {
18         if(cnt == 1 &&a[i]>a[i-1])
19         {
20             ans = 1;
21             break;
22         }
23         if(cnt == 2 &&a[i]>=a[i-1])
24         {
25             ans = 1;
26             break;
27         }
28         if(cnt == 0 && a[i]==a[i-1])
29             cnt = 1;
30         if(cnt != 2 && a[i]<a[i-1])
31             cnt = 2;
32     }
33     if(ans) cout<<"NO"<<endl;
34     else cout<<"YES"<<endl;
35     return 0;
36 }
View Code

B. Keyboard Layouts 题目链接:点击

题意:给你26个字母的对应关系 对于给定的字符串 求转换后的字符串(转换后不改变大小写,非字母不转换)

用map感觉很方便

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     map<char,char>mape;
 8     string a,b;
 9     cin>>a>>b;
10     for(int i=0;i<26;i++)
11     {
12         mape[a[i]] = b[i];
13     }
14     string cnt;
15     cin>>cnt;
16     string ans="";
17     for(int i=0;i<(int)cnt.size();i++)
18     {
19         if(cnt[i]>='a'&&cnt[i]<='z')
20         {
21             ans += mape[cnt[i]];
22         }
23         else if(cnt[i]>='A'&&cnt[i]<='Z')
24         {
25             ans += mape[cnt[i]-'A'+'a']-'a'+'A';
26         }
27         else
28         {
29             ans+=cnt[i];
30         }
31     }
32     cout<<ans<<endl;
33     return 0;
34 }
View Code

C. Jury Marks 题目链接:点击

题意:K个评委 每个评委都打分,Polycarp只听到部分某评委打分后的结果。求初始分数可能的个数是多少。

先把评委的打分前缀和一下  然后枚举暴力就好了  注意map查找key是否存在的时候一定不要map[key]=value; 太耗时了,算是涨了见识。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 map<int ,int> c;
 5 map<int ,int> ans;
 6 int main()
 7 {
 8     int num[2111];
 9     int nn[2111];
10     int n,k;
11     cin>>k>>n;
12     for(int i=1;i<=k;i++)
13         cin>>num[i];
14     for(int i=2;i<=k;i++)
15         num[i]=num[i]+num[i-1];
16     for(int i=1;i<=n;i++)
17         cin>>nn[i];
18     for(int i=1;i<=k;i++)
19     {
20         int count = 0;
21         for(int j=2;j<=n;j++)
22             c[nn[j]]=1;
23         int cc = nn[1]-num[i];
24         for(int j=1;j<=k;j++)
25         {
26             if(i==j) continue;
27             map<int,int>::iterator it = c.find(cc+num[j]);
28             if(it!=c.end())
29             {
30                 count ++;
31                 c.erase(it);
32             }
33         }
34         if(count == n-1)
35             ans[cc] = 1;
36     }
37     cout<<(int)ans.size()<<endl;
38     return 0;
39 }
View Code

D. Office Keys 题目链接:点击

题意:在一条直线上有三种元素 人 钥匙 办公室  要求所有人拿到钥匙然后进入办公室  问所有人进入办公室最低需要的时间。

将人和钥匙排序之后  暴力N个人取连续的N把钥匙 

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int pd(int a,int b,int c)
 6 {
 7     return abs(b-c)+abs(c-a);
 8 }
 9 
10 int main()
11 {
12     int person[1234];
13     int key[2345];
14     int n,k,p;
15     cin>>n>>k>>p;
16     for(int i=0;i<n;i++)
17         cin>>person[i];
18     sort(person,person+n);
19     for(int i=0;i<k;i++)
20         cin>>key[i];
21     sort(key,key+k);
22     int maxe = 2100000000;
23     for(int i=0;i<=k-n;i++)
24     {
25         int cnt = 0;
26         for(int j = 0; j<n;j++)
27         {
28             int len = pd(p,person[j],key[i+j]);
29             cnt = max(cnt,len);
30         }
31         maxe = min(maxe,cnt);
32     }
33     cout<<maxe<<endl;
34     return 0;
35 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!