zoukankan      html  css  js  c++  java
  • Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) A B C 题解

    A Sum of 2050

    题意:给定一个数字n,要求将n表示为一些2050*数字(不一定是不同的)的和。计算所需的最小2050个数。
    思路:如果不能整除2050则输出-1,否则输出商的每个位上的数字之和。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    long long res;
    int main() {
    	int t;
    	scanf("%d", &t);
    	
    	while (t--) {
    		scanf("%lld", &res);
    
    		if (res % 2050 == 0) {
    			res /= 2050;
    			long long ans = 0;
    			while (res) {
    				ans += res % 10;
    
    				res /= 10;
    			}
    			printf("%lld", ans);
    		}
    
    		else
    			printf("-1");
    
    		printf("
    ");
    	}
    	return 0;
    }
    

    B Morning Jogging

    题意:给你n个长度为m的数组,要求对其按行进行排列,使得每一列上的最小值之和最小,如果有多个答案,打印任何一个。
    思路:读懂题意之后就会发现,将所有n*m个数按升序排序,第i小的数(1<=i<=m)一定在第i列,而其余数随机排列即可,注意每一个数的行是不变的。
    到这一步之后,唯一纠结的地方就是这些数据应该怎样存储,怎样处理,又怎样进行输出。
    刚开始想着用小根堆的性质存储会不会贼方便,(然而菜鸡对于STL容器实在是太生疏了),于是用二维数组存储加上双指针标记暴力AC,事实上我认为开bool数组标记会更方便一些,当时有些着急了……

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    int n, m;
    int s[110][2];
    long d[110][110];
    long q[110][110];
    int main() {
    	int t;
    	scanf("%d", &t);
    	while (t--) {
    		scanf("%d %d", &n, &m);
    
    
    		for (int i = 1; i <= n; i++)
    			for (int j = 1; j <= m; j++)
    				scanf("%ld", &q[i][j]);
    
    		for (int i = 1; i <= n; i++) {
    
    			sort(q[i] + 1, q[i] + m + 1);
    			s[i][1] = m;
    			s[i][0] = 1;
    		}
    
    		for (int j = 1; j <= m; j++) {
    			int k = 1;
    			for (int i = 2; i <= n; i++)
    				if (q[i][s[i][0]] < q[k][s[k][0]])
    					k = i;
    
    			for (int i = 1; i < k; i++)
    				d[i][j] = q[i][s[i][1]--];
    
    			d[k][j] = q[k][s[k][0]++];
    
    			for (int i = k + 1; i <= n; i++)
    				d[i][j] = q[i][s[i][1]--];
    		}
    
    		for (int i = 1; i <= n; i++) {
    			for (int j = 1; j <= m; j++)
    				printf("%d ", d[i][j]);
    
    			printf("
    ");
    		}
    	}
    	return 0;
    }
    

    C Fillomino 2

    题意:给你一个n个数的全排列的其中一种排列方式
    其中这n个数分别为n*n矩阵的对角线
    求是否可以构造一个下三角矩阵
    满足这个矩阵对角线的每一个元素
    都有
    旁边与它相等的数的个数(包括它本身)等于这个元素的值
    如果存在这个矩阵,输出这个下三角矩阵
    如果不存在,输出-1
    思路
    看懂题目的条件下,很明显这题答案一定存在
    因为你举不出反例去反对它
    然后就是一个简单的贪心的做法了
    在不超过下三角矩阵范围的情况下
    每次优先把它左边的数变成和它一样的
    如果超了左边界
    就把下面的数变成和它一样的
    且一定不会超过下边界
    一共变a[i][i] - 1 次
    dfs或者bfs都可
    dfs代码如下

    #include<bits/stdc++.h>
    #define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
    #define re register int
    #define x first
    #define y second
    typedef long long ll ;
    using namespace std;
    const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
    int n ;
    int a[N] ;
    int s[M][M] ;
    bool st[M][M] ;
    int k ;
    void dfs(int i , int j , int res)
    {
        if(k == res) return ;
        if(i <= 0 || i > n || j <= 0 || j > n) return ;
        if(st[i][j]) return ;
        st[i][j] = true ;
        s[i][j] = res ;
        k ++ ;
        dfs(i,j-1,res) ;
        dfs(i+1,j,res) ;
    }
    int main()
    {
        cin >> n ;
        fer(i,1,n)
        {
            cin >> a[i] ;
            s[i][i] = a[i] ;
        }
        
        fer(i,1,n)
            fer(j,1,n)
                if(i == j)
                {
                    k = 0 ;
                    dfs(i,j,s[i][j]) ;
                }
                    
        fer(i,1,n)
        {
            fer(j,1,n)
                if(s[i][j] != 0) cout << s[i][j] << " " ;
            cout << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    MarkDown学习记录
    AngularJS+Ionic开发-2.项目结构介绍
    【二分+贪心+倍增】【NOIP2012】疫情控制
    【考试总结】NOIP模拟 test11-1
    【考试总结】NOIP模拟 test10-27
    【考试总结】AHSOFNU&QZQZ test10-25
    【差分+二分答案】【NOIP2012】借教室
    【动态规划】【NOIP2015】子串
    【高精度+贪心】【NOIP2012】国王游戏
    ICPC Central Russia Regional Contest (CRRC 19)题解
  • 原文地址:https://www.cnblogs.com/yueshehanjiang/p/14696303.html
Copyright © 2011-2022 走看看