2017-2018 ACM-ICPC Latin American Regional Programming Contest

题面pdfhttps://codeforc.es/gym/101889/attachments/download/7471/statements-2017-latam-regional.pdf

zyn感冒,两个人打。刚开始两题超迅速,40分钟后开始各种写不出,自闭。然后突然又开出两题。

4题全部1A,70名左右应该能稳个银。

说明卡题了可千万不能放弃!虽然可能简单题做不出来,过的多的题目做不出来,也不要放弃去开题。

以及周末这两场都说明一定要胆子大。

B---Buggy ICPC【找规律】

题意:

输入一串字符串,当遇到元音的时候前面输入的所有字符包括这个元音都反转一下。现在给定最后的结果字符串,问有多少种输入方法可以得到这个字符串。

思路:

czc去打了个表,然后我们疯狂找规律。真的找到规律了

如果没有元音,当然是1.如果有元音,但是第一个不是元音,一定是0

其他情况,答案就是中间两个元音之间的辅音个数$+1$。

只有一个元音时默认后面还有一个元音结尾,答案就是字符串长度。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 const int maxn = 1e5 + 5;
 6 char t[maxn];
 7 vector<int>pos_of_vowel;
 8 char vowel[5] = {‘a‘, ‘e‘, ‘i‘, ‘o‘, ‘u‘};
 9
10 int main()
11 {
12     while(scanf("%s", t) != EOF){
13         pos_of_vowel.clear();
14         int len = strlen(t), cnt = 0;
15         for(int i = 0; i < len; i++){
16             for(int j = 0; j < 5; j++){
17                 if(t[i] == vowel[j]){
18                     cnt++;
19                     pos_of_vowel.push_back(i);
20                 }
21             }
22         }
23
24         if(cnt == 0){
25             printf("1\n");
26         }
27         else{
28             bool flag = false;
29             for(int i = 0; i < 5; i++){
30                 if(t[0] == vowel[i]){
31                     flag = true;
32                     break;
33                 }
34             }
35             if(!flag){
36                 printf("0\n");
37             }
38             else{
39                 if(cnt == 1){
40                     printf("%d\n", len);
41                 }
42                 else{
43                     int id = (cnt + 1) / 2;
44                     //cout<<id<<endl<<pos_of_vowel[id]<<endl<<pos_of_vowel[id - 1]<<endl;
45                     int l = pos_of_vowel[id] - pos_of_vowel[id - 1];
46                     printf("%d\n", l);
47                 }
48
49             }
50         }
51     }
52     return 0;
53 }

H---Hard Choice【水题】

题意:

【略】

思路:

【略】

 1 #include<iostream>
 2 //#include<bits/stdc++.h>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<vector>
10 #include<set>
11 #include<climits>
12 #include<map>
13 using namespace std;
14 typedef long long LL;
15 #define N 100010
16 #define pi 3.1415926535
17 #define inf 0x3f3f3f3f
18
19 int a, b, c;
20
21 int main()
22 {
23     while(scanf("%d%d%d", &a, &b, &c) != EOF){
24         int x, y, z;
25         scanf("%d%d%d", &x, &y, &z);
26         int ans = 0;
27         if(x > a){
28             ans += x - a;
29         }
30         if(y > b){
31             ans += y - b;
32         }
33         if(z > c){
34             ans += z - c;
35         }
36         printf("%d\n", ans);
37     }
38 }

C---Complete Naebbirac‘s sequence【暴力】

题意:

有$n$个$1$到$k$之间的数。可以进行一下三种操作一次(只能一次):1、删去其中一个。2、添加一个$1$到$k$的数。3、将其中一个换成另一个$1$到$k$的数。使得他们出现的次数都一样。

思路:

因为只能操作一次。所以每种操作都讨论一下就行了。

首先统计一下每个数出现的次数,按照次数从小到大排序。

1、把第一个数次数加1,看所有数是否满足次数相同。

2、把最后一个数次数减1,看所有数是否满足次数相同。

3、把第一个数次数加1,最后一个数次数减1,看所有数是否满足次数相同。

 1 #include<iostream>
 2 //#include<bits/stdc++.h>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<vector>
10 #include<set>
11 #include<climits>
12 #include<map>
13 using namespace std;
14 typedef long long LL;
15 #define N 100010
16 #define pi 3.1415926535
17 #define inf 0x3f3f3f3f
18
19 int n, k;
20 const int maxn = 1e4 + 5;
21 int num[maxn];
22 struct node{
23     int num, cnt;
24 }se[1005];
25
26 bool cmp(node a, node b)
27 {
28     return a.cnt < b.cnt;
29 }
30
31 int main()
32 {
33     while(scanf("%d%d", &k, &n) != EOF){
34         for(int i = 0; i < 1005; i++){
35             se[i].num = i;
36             se[i].cnt = 0;
37         }
38         for(int i = 0; i < n; i++){
39             scanf("%d", &num[i]);
40             se[num[i]].cnt++;
41         }
42
43         sort(se + 1, se + k + 1, cmp);
44         bool flag = true;
45         se[1].cnt++;
46         for(int i = 1; i <= k-1; i++){
47             if(se[i].cnt != se[i + 1].cnt){
48                 flag = false;
49                 break;
50             }
51         }
52         if(flag){
53             printf("+%d\n", se[1].num);
54         }
55         else{
56             se[k].cnt--;
57             bool flag2 = true;
58             for(int i = 1; i <= k - 1; i++){
59                 if(se[i].cnt != se[i + 1].cnt){
60                     flag2 = false;
61                     break;
62                 }
63             }
64             if(flag2){
65                 printf("-%d +%d\n", se[k].num, se[1].num);
66             }
67             else{
68                 se[1].cnt--;
69                 bool flag3 = true;
70                 for(int i = 1; i <= k - 1; i++){
71                     if(se[i].cnt != se[i + 1].cnt){
72                         flag3 = false;
73                         break;
74                     }
75                 }
76                 if(flag3){
77                     printf("-%d\n", se[k].num);
78                 }
79                 else{
80                     printf("*\n");
81                 }
82             }
83         }
84     }
85 }

J---Jumping Frog【数论】【环形dp】

题意:

有n个位子,有的是石头(R), 有的是池塘(P)。青蛙只能在石头上跳,不能跳到池塘里去。每次他选择一个k,表示他每次跳k步,希望他可以跳回到起点。问以所有的位子为起点,一共能有多少种不同的k的选择。

思路:

这题是真的没思路。czc自己刷刷刷就敲完1A了。附一下他的代码。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4 const int MAX_N = 1e5 + 5;
 5
 6 int N;
 7 char S[MAX_N];
 8
 9 vector <int> factor;
10 void getFactors(int N)
11 {
12     factor.clear();
13     for (int i = 1; i <= N/i; i++) {
14         if (N%i == 0) {
15             factor.push_back(i);
16             if (i*i != N)
17                 factor.push_back(N/i);
18         }
19     }
20     sort(factor.begin(), factor.end());
21 }
22
23 bool f[MAX_N << 1][50];
24 bool can_jump[MAX_N];
25 void dp()
26 {
27     int cnt = factor.size();
28     memset(f, false, sizeof f);
29     for (int i = 1; i <= 2*N; i++) {
30         for (int j = 0; j < cnt; j++) {
31             int tmp = factor[j];
32             if (S[(i-1)%N] == ‘P‘)
33                 f[i][j] = false;
34             else if (S[(i-1)%N] == ‘R‘) {
35                 if (i-tmp <= 0)
36                     f[i][j] = true;
37                 else
38                     f[i][j] = f[i-tmp][j];
39             }
40         }
41     }
42
43     memset(can_jump, false, sizeof can_jump);
44     for (int i = N+1; i <= 2*N; i++) {
45         for (int j = 0; j < cnt; j++) {
46             int tmp = factor[j];
47             if (f[i][j])
48                 can_jump[tmp] = true;
49         }
50     }
51 }
52
53 inline int gcd(int a, int b)
54 {
55     return a%b ? gcd(b, a%b) : b;
56 }
57
58 int main()
59 {
60     scanf("%s", S);
61     N = strlen(S);
62     getFactors(N);
63     dp();
64
65     int ans = 0;
66     for (int k = 1; k <= N-1; k++) {
67         int g = gcd(k, N);
68         if (can_jump[g])
69             ans++;
70     }
71     cout << ans << endl;
72     return 0;
73 }

原文地址:https://www.cnblogs.com/wyboooo/p/9978465.html

时间: 2024-08-02 22:40:21

2017-2018 ACM-ICPC Latin American Regional Programming Contest的相关文章

训练20191007 2017-2018 ACM-ICPC Latin American Regional Programming Contest

2017-2018 ACM-ICPC Latin American Regional Programming Contest 试题地址:http://codeforces.com/gym/101889 总体情况 总共通过7题CEFGHIJ.其中我完成HIJ三题.纯属被大佬带飞系列. 解题报告 H - Hard choice 签到题 #include <bits/stdc++.h> using namespace std; int a1,b1,c1,a2,b2,c2; int main() {

2017-2018 ACM-ICPC Latin American Regional Programming Contest Solution

A - Arranging tiles 留坑. B - Buggy ICPC 题意:给出一个字符串,然后有两条规则,如果打出一个辅音字母,直接接在原字符串后面,如果打出一个元音字母,那么接在原来的字符串后面之后再翻转整个字符串,在这两条规则之下,求有多少种打印给定字符串的方法 思路:如果第一个字符是辅音,那么答案为0 如果全是辅音或全是元音,那么答案为1 如果只有一个辅音,答案为len 否则是最中间两个元音中间的辅音字符个数+1 1 #include <bits/stdc++.h> 2 3 u

2017-2018 ACM-ICPC Latin American Regional Programming Contest GYM101889

挺有意思的一套题,题也没有啥毒瘤了,本来是队切的结果种种原因大家全挂机了. 只补了百人题,一共7个,其他的暂时先不补了,,也不会嘛qwq H:签到 1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[18],b[18]; 4 int main(){ 5 cin>>a[1]>>a[2]>>a[3]>>b[1]>>b[2]>>b[3]; 6 int ans = 0

2019-2020 ACM-ICPC Latin American Regional Programming Contest L - Leverage MDT

#include<map> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define LL long long const int N=1010; int val[N][N]; int res[N][N]; char c[N][N]; int n,m; bo

2019-2020 ACM-ICPC Latin American Regional Programming Contest I - Improve SPAM 树形dp?

#include<iostream> #include<cstring> #define int long long using namespace std; const int N=4010,mod=1e9+7; int a[N]; int e[N*N],ne[N*N],idx,h[N]; int st[N]; int ans; int ans1[N]; int read() { int res=0,ch,flag=0; if((ch=getchar())=='-') //判断正

2019-2020 ACM-ICPC Latin American Regional Programming Contest A- Algorithm Teaching 二分图

#include<bits/stdc++.h> #define f first #define s second using namespace std; typedef long long ll; const int N=300005; typedef pair<int,int> P; int n,tot,t,V; map<string,int> mp; map<vector<int>,int> mp2; vector<int> G

2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)

J题队友犯了初始化的错,白给6发,本来能1A的 B: solver:lzh.czq 就是个拓扑排序 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 #define mp make_pair 6 typedef long long ll; 7 typedef pair<int, int> pii; 8 9 vector<int> g[400

极角排序——ICPC Latin American Regional Contests 2019 D

这题还是按角度进行极角排序简单点 /* 按亮度从大到小排序,从大的给小的连一条向量,极角排序后所有向量在两个象限内,那么可行,反之不可行 */ #include<bits/stdc++.h> using namespace std; #define N 1005 typedef double db; const db eps=1e-8; const db pi=acos(-1); int sign(db k){ if (k>eps) return 1; else if (k<-ep

2019-2020 ICPC Southwestern European Regional Programming Contest (SWERC 2019-2020)

J想到了卡特兰数,也想到要按最小值分割数组,丢给队友之后两个人都没做出来,傻了 题目链接:https://codeforces.com/gym/102501 B: solver:czq 1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8