• Educational Codeforces Round 55 (Rated for Div. 2)


    A. Vasya and Book

    题意:

    给四个数据 n, x, y, d。 n为书总共多少页,x为当前页数,y为目标页数,一次必须翻d页,但是范围在1~n,询问最少翻的次数

    情况

    1. abs(x-y)%d == 0 正好到达 则输出 abs(x-y)/d

    2.往前翻到 1 此时为1 到 y 。 当 (y-1)%d == 0 则说明从1 可以翻到y 

    3. 往后翻到n 此时为n 到y。 当(n-y) %d == 0 说明可以从n翻到y

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<iostream>
    #include<cstdlib>
    #include<vector>
    #include<queue>
    using namespace std;
    typedef long long LL;
    const int inf = 0x3f3f3f3f;
    
    int main() {
    	int T, n, x, y, d;
    	scanf("%d", &T);
    	while(T--) {
    		int ans = inf;
    		scanf("%d%d%d%d", &n,&x,&y,&d);
    		if(abs(x-y)%d == 0) { printf("%d
    ", abs(x-y)/d); continue ;}
    		if((y-1)%d == 0) ans = min(ans, (x-1)/d+1 + (y-1)/d);
    		if((n-y)%d == 0) ans = min(ans, + (n-x)/d + 1 + (n-y)/d);
    		if(ans == inf) printf("-1
    ");
    		else printf("%d
    ", ans);
    	}
    }

    B. Vova and Trophies

    题意:给n的字符的字符串,只有s与g,交换两个字母,让g的连续长度最长。输出最长的值

    思路:最长肯定是GGGGSGGGGG这种最长,我们就记录一个S前后的g的长度。前为a后为b则答案为a+b+1

               特殊情况就是没有交换的S,我们的S必须交换成G。 如GGSGG 则答案为4不为5 a+b+1 = 2 + 2 + 1

    代码

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<iostream>
    #include<cstdlib>
    #include<vector>
    #include<queue>
    using namespace std;
    typedef long long LL;
    const int inf = 0x3f3f3f3f;
    const int MaxN = 1e5 + 5;
    char s[MaxN];
    
    int main() {
    	int n;
    	scanf("%d%s", &n, s);
    	int a = 0, b = 0, c = 0, ans = 0;
    	for(int i = 0; i < n; i++) {
    		if(s[i] == 'G') a++, c++;
    		else {
    			b = a;
    			a = 0;
    		}
    		ans = max(ans, a + b + 1);
    	}
    	ans = min(c, ans);  //ans最大也不能超过G的数量
    	printf("%d
    ", ans);
    }

    C. Multi-Subject Competition

    前缀和。。有点意思把

    
    const int MaxN = 1e5 + 5;
    int ans[MaxN];
    vector<int> v[MaxN];
    
    bool cmp(int a, int b) { return a > b; }
    
    int main() {
    	int n, m;
    	scanf("%d%d", &n, &m);
    	for(int i = 0; i < n; i++) {
    		int s, r;
    		scanf("%d%d", &s, &r);
    		v[s].push_back(r);
    	}
    
    	int cnt = -1; // 记录v[i].size()的最大值 
    	for(int i = 1; i <= m; i++) {
    		int len = v[i].size(), sum = 0;
    		sort(v[i].begin(), v[i].end(), cmp);
    		cnt = max(cnt, len);
    
    		for(int j = 0; j < len; j++) {
    			sum += v[i][j];
    			if(sum < 0) break;
    			ans[j+1] += sum;
    		}
    	}
    	sort(ans + 1, ans + 1 + cnt);
    	printf("%d
    ", ans[cnt]);
    
    }
    
    

    D. Maximum Diameter Graph

    建立一个直径最大的数。度大于1 的建立直径,然后将1添上

    一个错误的答案。求一个有缘人

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    
    int ans[510][510];
    struct node{
    	int val;
    	int id;
    }arr[510];
    
    bool cmp(node a, node b) { return a.val < b.val; }
    
    int main() {
    	int n, num1 = 0, cnt = 0;
    	scanf("%d", &n);
    	for(int i = 1; i <= n; i++) {
    		scanf("%d", &arr[i].val);
    		if(arr[i].val == 1) num1++;
    		arr[i].id = i;
    	}
    	sort(arr + 1, arr + n + 1, cmp);
    	if(num1 == n) { printf("NO
    "); return 0; }
    
    	for(int i = num1+1; i < n; i++) {
    		ans[arr[i].id][arr[i+1].id] = 1;
    		cnt++;
    		arr[i].val--;
    		arr[i+1].val--;
    	}
    	int p = num1;
    	for(int i = n; i > num1; i--) {
    		while(arr[i].val && p) {
    			cnt++;
    			ans[arr[p].id][arr[i].id] = 1;
    			arr[i].val--;
    			p--;
    		}
    	}
    	if(p) { printf("NO
    "); return 0; }
    	printf("YES %d
    ", min(n-num1+1, n-1));
    	printf("%d
    ", cnt);
    	for(int i = 1; i <= n; i++)
    		for(int j = 1; j <= n; j++) 
    			if(ans[i][j]) printf("%d %d
    ", i, j);
    }
    
    

    一个a了的答案

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    
    int ans[510][510];
    struct node{
    	int val;
    	int id;
    }arr[510];
    
    bool cmp(node a, node b) { 
    	return a.val < b.val;
    }
    
    int main() {
    	int n, num1 = 0, cnt = 0;
    	scanf("%d", &n);
    	for(int i = 1; i <= n; i++) {
    		scanf("%d", &arr[i].val);
    		if(arr[i].val == 1) num1++;
    		arr[i].id = i;
    	}
    	if(num1 == 0) num1 = 1;
    	sort(arr + 1, arr + n + 1, cmp);
    	if(num1 == n) { 
    		printf("NO
    "); 
    		return 0; 
    	}
    
    	for(int i = num1; i < n; i++) {
    		ans[arr[i].id][arr[i+1].id] = 1;
    		cnt++;
    		arr[i].val--;
    		arr[i+1].val--;
    	}
    	int p = num1-1;
    	for(int i = n; i >= num1; i--) {
    		while(arr[i].val && p) {
    			cnt++;
    			ans[arr[p].id][arr[i].id] = 1;
    			arr[i].val--;
    			p--;
    		}
    	}
    	if(p) { printf("NO
    "); return 0; }
    	printf("YES %d
    ", min(n-num1+1, n-1));
    	printf("%d
    ", cnt);
    	for(int i = 1; i <= n; i++)
    		for(int j = 1; j <= n; j++) 
    			if(ans[i][j]) printf("%d %d
    ", i, j);
    }
  • 相关阅读:
    Numpy(0)
    C++(成员函数做友元)
    C++(类做友元)
    CUDA---Arrayfire---添加cuda kernel
    CUDA--Arrayfire--类型转换
    C++(友元)
    C++(const修饰成员函数)
    C++(空指针访问成员函数)
    第9章 整合前端
    第8章 离不开的数据库
  • 原文地址:https://www.cnblogs.com/smuzoey/p/11787443.html
Copyright © 2020-2023  润新知