Codeforces Round #666 (Div. 2) abcd

tech2023-11-05  105

考完试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)