上午LeetCode周赛自闭,晚上cf再次自闭…
题目链接
n个字符串,每次操作可以选择两个字符串(可以相同)选择其中一个字符串中某一字符插入到另一字符串。问:操作任意次,能否使得所有字符串都相同?
只需判断所有字符串的任意字符的数量都是n的倍数即可。(看题慢了,再加上上场没注意很多细节,导致交的比较慢…)
#include
#include
#include
#include
#include
#include
#include
#define lowbit x x&(-x)
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn=1e5+5;
string s;
map<char,int>mp;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
mp.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>s;
int len=s.length();
for(int j=0;j<len;j++) mp[s[j]]++;
}
int flag=0;
map<char,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
int num=it->second;
if(num%n==0) continue;
else{
flag=1;break;
}
}
if(flag==0) printf("YES\n");
else printf("NO\n");
}
return 0;
}
题目链接
n个数组成的数组,下标为0~n-1,首先对数组从小到大排序,然后有一操作:可以对任意数组中任意一个元素的值加一或者减一,代价为1;问最少需要多少代价可以使得数组a[i]= c i c^i ci.
首先最差的情况是所有的元素都为1,然后可以枚举c,并不断更新此时的最差代价,如果出现某一c的值所取得的代价比当前最差代价还要大时,则证明已经找到最小代价。具体见代码
#include
#include
#include
#include
#include
#include
#include
#define lowbit x x&(-x)
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn=1e5+5;
int a[maxn],n;
ll ans;
int check(int c){
ll now=1;
ll sum=abs(a[1]-1);
for(int i=2;i<=n;i++){
now*=c;
sum+=abs(a[i]-now);
if(sum>=ans) return 0;
}
ans=sum;
return 1;
}
int main(){
scanf("%d",&n);
ans=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ans+=a[i];
}
sort(a+1,a+n+1);
ans-=n;
for(int c=2;;c++){
if(check(c)==0) break;
}
printf("%lld\n",ans);
return 0;
}
题目链接
n个元素组成的数组,有一操作:对于某一段区间[l,r],可以加上该区间长度len的任意倍数。题目说明:可以证明三次操作可以使得数组所有元素都变成0。
#include
#include
#include
#include
#include
#include
#include
#define lowbit x x&(-x)
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn=1e5+5;
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%lld\n",-a[1]);
printf("1 1\n0\n");
printf("1 1\n0\n");
return 0;
}
printf("1 %d\n",n-1);
for(int i=1;i<n;i++){
printf("%lld",a[i]*(n-1));
if(i==n-1) printf("\n");
else printf(" ");
a[i]=a[i]*n;
}
printf("%d %d\n",n,n);
printf("%d\n",-a[n]);
a[n]=0;
printf("1 %d\n",n);
for(int i=1;i<=n;i++){
printf("%lld",-a[i]);
if(i==n) printf("\n");
else printf(" ");
}
return 0;
}
恶心的博弈,赛后看的tourist的代码…
#include
#include
#include
#include
#include
#include
#include
#define lowbit x x&(-x)
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn=1e5+5;
int a[110];
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int maxnum=0,sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
maxnum=max(a[i],maxnum);
sum+=a[i];
}
if(maxnum>sum-maxnum||sum%2==1) printf("T\n");
else printf("HL\n");
}
return 0;
}