codeforces——贪心

codeforces 804A Find Amir   http://codeforces.com/problemset/problem/804/A

/*
题意:给定n个学校,需要遍历所有学校,可从任意一点开始.
i到j有(i+j) mod (n+1) 的花费,求最小花费。

考虑贪心:先走和为n+1的两处,走完后最小只能再走到和为n+1的学校,再走到和为n的
例如: 1 2 3 4 5 6 7 8 9 10
先走1->10 花费为0 
再走10->2 花费为1
再走2->9 花费为0
...
最后答案,如果n是奇数,就是n/2 否则就是n/2-1. 
*/
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int n,ans;

int main()
{
    scanf("%d",&n);
    if(n%2==1) printf("%d\n",n/2);
    else printf("%d\n",n/2-1);
    return 0;
} 
难度系数0.2

 codeforces 803A Maximal Binary Matrix     http://codeforces.com/problemset/problem/803/A

/*
题意:给你一个n*n的矩阵,让你往里面填1,使得这个矩阵对称
然后输出这个矩阵字典序最大的那个矩阵
如果无法完成就输出-1,矩阵字典序就是每行都进行字典序比较 

贪心.首先k>n*N肯定是输出-1,剩下的,由于是要输出字典序最大的,
那么肯定是尽可能把每一行都填满,但是要对称着填,对角线上消耗一个1,其余地方消耗两个1
*/
#include<iostream>
#include<cstdio>
#include<cstring>

#define maxn 101

using namespace std;
int a[maxn][maxn];
int n,k,cnt,ans;

int main()
{
    scanf("%d%d",&n,&k);
    if(k>n*n)
    {
        puts("-1");
        return 0;
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(a[i][j])continue;
        if(i==j&&k)
        {
            k--;
            a[i][j]=1;
        }
        else if(k>=2)
        {
            k-=2;
            a[i][j]=a[j][i]=1;
        }
    }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
      {
          printf("%d ",a[i][j]);
          if(j==n)
            printf("\n");
      }
    return 0;
}
难度系数0.4

 

posted @ 2017-05-17 21:01  安月冷  阅读(290)  评论(0编辑  收藏  举报