Codeforces Round #666 (Div. 2) abcd

考完试cf复健感觉自己啥都不会写了 虽然之前本来就很菜

A. Juggling Letters

题目思路

一个水题 直接统计所有字母出现次数
如果存在模n不为0的字母 就输出no
不存在就输出yes

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include  <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e6+10;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1000000007;
//998244353

int mp[30];
char str[1005];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<=30;i++)mp[i]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",str);
            int len=strlen(str);
            for(int i=0;i<len;i++)
            {
                int tem=str[i]-'a';
                mp[tem]++;
            }
        }
        int flag=0;
        for(int i=0;i<=30;i++)
        {
            if(mp[i]%n!=0)flag=1;
        }
        if(flag==1)
            printf("NO\n");
        else
            printf("YES\n");
    }
}

B. Power Sequence

这道题一开始写了好久发现思路错了
然后看了下题解思路 重新写写了好久才a

题目思路

根据题目意思 我们可以先对数组从小到大排序
我们可以处理出每个位置上最接近的c
然后维护最小的作为c的起始值
有题目知道我们要求的是Σ(数组第i位-c的i次方)的最小值
我们可以暴力搜索最小值
如果对于当前的c做求和的值大于当前最小值
那么之后的值也是一定大于当前最小值的
所以我们舍去后面那一段就行了

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include  <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1000000007;
//998244353

ll a[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    sort(a+1,a+1+n);
    ll ans=1e18;
    ll tem=a[1]-1;
    for(int i=2;i<=n;i++)
        tem=min(tem,(long long)pow(a[i],1.0/i-1));//这里开始没处理 直接让2作为起始值wa了好多发
    while(1)
    {
        ll temp=0;
        ll x=1;
        for(int i=1;i<=n;i++)
        {
            temp+=abs(a[i]-x);
            x*=tem;
            if(temp>=ans)break;
        }
        if(temp<ans)
            ans=temp;
        else
            break;
        tem++;

    }
    printf("%lld\n",ans);
}

C. Multiples of Length

这题真是完全没思路 之前就不怎么会做构造题
看着题目发了将近20分钟呆

题目思路

对于构造体来说一般都是直接对整体做操作
先对情况分类
当n=1时 三次操作 一次用来让a[1]=0 剩下两次输出0就好了
当n!=1时
第一次也是直接让a[1]=0
第二次则是让2到n上每个数减去n*a[i],但是这样不符合题目的要求
所以要加上第一位 然后对应位置输出0就好了
第三次就是对2到n上每个数加上(n-1)*a[i]
这样就能讲整个数组变为0了
一个非常巧妙的思路

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include  <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1000000007;
//998244353

ll a[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    if(n!=1)
    {
        printf("1 1\n");
        printf("%d\n",-1*a[1]);
        printf("1 %d\n",n);
        for(int i=1;i<=n;i++)
        {
            if(i==1)printf("0");
            else printf(" %lld",-1*a[i]*n);
        }
        printf("\n2 %d\n",n);
        for(int i=2;i<=n;i++)
        {
            printf("%lld ",a[i]*(n-1));
        }
        printf("\n");
    }else
    {
        printf("1 1\n");
        printf("%lld\n",-1*a[1]);
        printf("1 1\n");
        printf("0\n");
        printf("1 1\n");
        printf("0\n");
    }

}

d题待补

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值