考完试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题待补