561 div2

A. Silent Classroom

题意: 有一些同学  如果其名字首字母相同的话  如果分到同一个教室  那么会增加1该教室的吵闹值  (每一对增加一    3个人名字首字母相同的话会增加3 )一共有两个教室  求最小吵闹值之和(两个教室的)

贪心:显然  姓氏相同的人对半分到两个教室即可  而且吵闹值有等差公式求和规律

 #include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=200;

int a[N];
int main()
{
    int n;
    char s[N];
    RI(n);
    int ans=0;
    while(n--)
    {
        RS(s);
        a[s[0]-'a'+1]++;
    }
    rep(i,1,26)
    if(a[i]>=3)
    {
        int q=a[i]/2,w=a[i]-q;
        q--;w--;
        ans+=(1+q)*q/2;
        ans+=(1+w)*w/2;
    }
    cout<<ans;

    return 0;
}
View Code

B. All the Vowels Please

题意:给出一个数k  要求将其表示为k个格子   这些格子形成一个矩形  这个矩形每行每列都有5个元音 aeiou 

错着排即可:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=200;

char mp[N][N];
char table[]={'a','e','i','o','u'};

int main()
{
    int n,a,b,ok=0;
    RI(n);

    rep(i,5,n)
    {
        if(n%i==0&&n/i>=5)
        {
            a=i;b=n/i;ok=1;break;
        }
    }
    if(!ok){printf("-1");return 0;}

    int now=0;

    rep(i,1,a)
    {
        int cnt=now;
        rep(j,1,b)
        {
            mp[i][j]=table[ cnt%5 ];cnt++;
        }
        now++;
    }
    rep(i,1,a)rep(j,1,b)cout<<mp[i][j];

    return 0;
}
View Code

C. A Tale of Two Lands

题意:有两个人a,b   对于两个整数x,y 每个人有一个技能

a:   将|x| |y|之间的线段划分为其领土  包括端点

b:将|x-y| |x+y|之间的线段划分为其领土  

给出n个数   求里面有多少对xy(无序) 使得b的领土完全包含a的领土

题目看了半天  看懂了还是挺简单的 

显然这题正负值是没用的    所以预处理全部取正

右点|x+y| 肯定是满足的     y-x<=x  所以要  y<=2*x

二分搜索即可

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=2e5+5;
int a[N];
int main()
{
    int n;RI(n);
    rep(i,1,n)
    {
        int x;RI(x);
        a[i]=(x>0?x:-x) ;
    }
    sort(a+1,a+1+n);
    ll sum=0;

    rep(i,1,n)
    {
        int pos=upper_bound(a+1,a+1+n,2*a[i])-a;
        pos--;
        if(pos>i)sum+=(ll)pos-i;
    }
    cout<<sum;

    return 0;
}
View Code

D. Cute Sequences

 题意:给出a,b,m

构造出一个序列  a[i]-s[i-1]<=m ( s[i]为前缀和 )   且头为a 尾为b 

如果没有则输出-1  

E. The LCMs Must be Large

有一个人去购物   一共有n个商店 每个商店有一个数值ai

给出m天

每天  k个数字表示 买下了这些数字编号的商店的 数字(货物)

他没有买的则被他竞争对手买去

只有他买下的所有数字的最小公倍数大于他竞争对手买下的数字的最小公倍数  他才认为他赢了

问:有没有n个ai 使得他每天都赢?  (不需要输出序列)

如果两天的数字没有交集 显然就冲突了  否则就是存在的

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=2e5+5;
int a[55][10005];
int n, m;

int main() {
    RII(m,n);
    for(register int i = 1; i <= m; i++) {
        int k; RI(k);
        for(register int j = 1; j <= k; j++) {
            int t; RI(t);
            a[i][t] = 1;
        }
    }
    for(register int i = 1; i <= m; i++) {
        for(register int j = i + 1; j <= m; j++) {
            bool ok = 1;
            for(register int k = 1; k <= n; k++) {
                if(a[i][k] && a[j][k]) {
                    ok = 0;
                    break;
                }
            }
            if(ok) {
                cout << "impossible" << endl;
                return 0;
            }
        }
    }
    cout << "possible" << endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/bxd123/p/10906543.html