#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e3+7;int n,m,k,t =1,cas =1;int a[N],b[N];int sel =0;signedmain(){
cin>>t;while(t--){
cin>>n>>k;int tmp =0;for(int i =0; i < n ; i ++){
cout<<(char)(tmp+'a');
tmp =(tmp+1)%3;}
cout<<endl;}}
B. Find the Spruce
题意:一个矩阵,找出有多少个满足条件的子矩阵。就是这种形状的:
思路:暴力枚举子矩阵。然后判断。不过要预处理一下,每一行的每个子区间是不是全是*号。不然会超时。
AC代码:
#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e3+7;int n,m,k,t =1,cas =1;int a[N],b[N];int sel =0;
string s[N];bool mark[505][505][505];boolcheck(int i,int j,int k){return mark[i][j][k];}signedmain(){
cin>>t;while(t--){
cin>>n>>m;for(int i =0; i < n ; i ++){
cin>>s[i];}memset(mark,0,sizeof(mark));for(int i =0; i < n ; i ++){for(int j =0; j < m ; j ++){if(s[i][j]=='*'){int tmp =0;while(!(j-tmp <0|| j+tmp >= m)){if(s[i][j-tmp]=='*'&& s[i][j+tmp]=='*'){
mark[i][j-tmp][j+tmp]=1;}else{break;}
tmp +=1;}}}}int res =0;for(int i =0; i < n ; i++){for(int j =0; j < m ; j ++){for(int k =0; k+i < n ; k ++){if(j-k <0|| j+k >= m)break;if(check(i+k,j-k,j+k)){
res ++;}else{break;}}}}
cout<<res<<endl;}}
思路:首先看,要排序,至少要r为多少。小于r的不用考虑。因为不管前面排布排序,r位置不排序整个数组就无序。然后对于所有的大于r的区间。假设他们 全部都失败了。就是 p 等于 (1-pi) 的连乘。1- p 就是最后的概率。因为只要有其中一个成功就成功了。所以用1 减去 全部失败的概率。
AC代码:
#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];int sel =0;
string s[N];bool mark[505][505][505];boolcheck(int i,int j,int k){return mark[i][j][k];}struct node{int r;double p;}p[N];boolcmp(node a1,node a2){return a1.p > a2.p;}signedmain(){
cin>>t;while(t--){
cin>>n>>m;for(int i =0; i < n ; i ++) cin>>a[i];for(int i =0; i < n ; i ++) b[i]= a[i];int r = n;sort(b,b+n);for(int i = n-1; i >=0; i --){if(a[i]== b[i]){
r --;}elsebreak;}for(int i =0; i < m ; i ++){
cin>>p[i].r>>p[i].p;}if(r ==0){printf("1.000000\n");continue;}double res =1;for(int i =0; i < m ; i ++){if(p[i].r < r )continue;
res *=(1-p[i].p);}
cout<<1-res<<endl;}}
#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];int sel =0;int sum[N];
map<int,int> mp;voidsplit(int l,int r){if(l == r){mp[a[l]]=1;return;}if(l > r)return;int mid =(a[l]+a[r])>>1;int pos =upper_bound(a+l,a+r+1,mid)-a;
mp[sum[r]-sum[l-1]]=1;if(pos <= r){
mp[sum[r]-sum[pos-1]]=1;
mp[sum[pos-1]-sum[l-1]]=1;split(l,pos-1);split(pos,r);}}signedmain(){
cin>>t;while(t--){
cin>>n>>m;
mp.clear();for(int i =1; i <= n ; i ++)
cin>>a[i];sort(a+1,a+n+1);for(int i =1; i <= n ; i ++)
sum[i]= sum[i-1]+a[i];
mp[sum[n]]=1;split(1,n);for(int i =0; i < m ;i ++){int q; cin>>q;puts(mp[q]?"Yes":"No");}}}
Codeforces Round #689 (Div. 2, based on Zed Code Competition)
A. String Generation题意:造一个字符串,只用’a’,‘b’,'c’三个字符。要求其中不存在大于k的回文子串。思路:水题。直接循环输出abcabcabc就好了。显然没有回文。AC代码:#include <iostream>#include <bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusing namespace std;const double