总结:这一场挺不容易的,思路也是挺奇特的,就是做上去感觉怪怪的,没有一点感觉
A. Garland
思路:不能连续操作两个相同颜色的灯泡,所以记录灯泡的颜色的数量,因为只有四个灯泡,便可以分情况来讨论,若最大数量为4,即只有一种颜色,则不能操作成功,输出-1,若最大颜色数量为3,则操作6次即可,若最大颜色数量为其他,操作4次,算是找出来的规律吧
//可以学习一个记数的方法!!!
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int x[10];
int main(){
int T;
string s;
cin>>T;
while(T--){
memset(x,0,sizeof(x));
cin>>s;
//记录每个数字出现的次数即可
for(int i=0;i<4;i++){
x[s[i]-'0']++;
}
//排序并输出结果
sort(x,x+10);
int a=x[9],b=x[8],c=x[7],d=x[6];
//模拟答案并输出即可
if(a==4){
cout<<-1<<'\n';
}else if(a==3){
cout<<6<<'\n';
}else{
cout<<4<<'\n';
}
}
return 0;
}
B. Points on Plane
做法也是挺奇特的,开始时完全没有想到,还想到了分情况讨论,以及BFS啥的,但发现自己写不出来,只能看大佬的代码,后来发现自己就是个傻
思路:不想写麻烦的代码,那就找规律吧,将原点有点和没点的情况都画出来,可发现所有的点可围成正方形,即可以找到规律,推出公式
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
signed main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
cout<<(int)sqrt(n-1)<<'\n';
//sqrt的返回值类型double
//先n-1就等于,sqrt(n)上取整再减1
}
}
C. Sum on Subarrays
这题困扰了我好久,真的是做吐了的。。。
思路:注意!!!这道题的要求比较苛刻,子序列的和只能是正数或者负数,不能为0!!!因为数据量很小,最多只有30个数,所以初始化为-100即可,前面都是正数(设为2),后面都是复数,每增加一个整数贡献i,如果再加一个正数超过目标值(ans<k&&ans+i+1>k),则要根据前面的2的数量增加一个复数(-((i-k+ans)*2+1)),注意不能出现0,所以要加1!!!
#include<iostream>
using namespace std;
const int N=35;
int a[N];
int main(){
int T,n,k,ans;
cin>>T;
while(T--){
ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
a[i]=-100;
}
for(int i=1;i<=n;i++){
ans+=i;
if(ans<=k){
a[i]=2;
}
if(ans<k&&ans+i+1>k){
a[i+1]=-((i-k+ans)*2+1);
break;
}
}
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
cout<<'\n';
}
}