A 新年礼物(数学)
这个题之前cf div2刚刚考过应该都会吧。就是把左边界×2遍历一下就可以了
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll l,r,sum=0;
cin>>l>>r;
for(ll i=l;i<=r;)
i*=2,sum++;
cout<<sum;
}
B 水(看不懂题)
待填坑
C 滴(物理)
追击相遇问题其中一个走了一段的距离了,两个都是匀速直线运动这个物理题应该都会的
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
double x,y,t;
cin>>x>>y>>t;
double tm=x*t/(y-x);
double ans=t*x+tm*x;
cout<<int(ans);
}
D 石(思维)
这个题比较厉害,首先感谢qut同学的帮助
我们发现如果直接去遍历所有的子集的话那么对于100来说这个量是巨大的,并且要求有多少不相同的子集和,那么我们第一想到的事开桶
开完桶之后我们想的就是去遍历,遍历怎么遍历?怎么模拟子集的遍历而且还不T
这里qut的同学提供了一种O(n*n)的解法
外层的for用来遍历每个数对于每个数我们需要对前面所有的不重复的数进行一次加法
①首先遍历一次,把之前的所有的数都加起来然后再bk判定
②把这个数自己bk判定
输出总共计数的t即可,也可以用set。这里得用map了因为不知道要记录多大
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<ll,ll> bk,num;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n,t=0;
cin>>n;
for(int i=0;i<n;i++)
{
ll p,q;
cin>>p;
q=t;
for(int j=0;j<q;j++)
{
if(!bk[p+num[j]])
{
bk[p+num[j]]=1;
num[t++]=p+num[j];
}
}
if(!bk[p])
{
bk[p]=1;
num[t++]=p;
}
}
cout<<t;
}
E 穿(字符串基础)
直接暴力枚举即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
ll bk[1000][1000],bk1[1000][1000];
ll n,k,re=0;
set<string> st;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string t="";
cin>>n>>k>>num[0];
sum[0]=num[0]%4;
for(int i=1;i<n;i++)
num[i]=(num[i-1]*6807+2831)%201701,sum[i]=num[i]%4;
for(int i=0;i<n;i++)
{
if(sum[i]==0)
t+='A';
else if(sum[i]==1)
t+='T';
else if(sum[i]==2)
t+='C';
else if(sum[i]==3)
t+='G';
}
for(int i=0;i<n-k+1;i++)
{
string te="";
for(int j=0;j<k;j++)
te+=t[i+j];
st.insert(te);
}
cout<<st.size();
}
F 有(不明)
待填坑
G 志(贪心)
拿出来排个序求一下前缀和然后加把起来就行了
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n,re=0;
cin>>n>>num[0];
sum[0]=num[0]%100+1;
for(int i=1;i<n;i++)
num[i]=(num[i-1]*6807+2831)%201701,sum[i]=(num[i]%100)+1;
sort(sum,sum+n);
for(int i=0;i<n;i++)
{
if(i)
ans[i]=ans[i-1]+sum[i];
else
ans[i]=sum[i];
}
for(int i=0;i<n;i++)
re+=ans[i];
cout<<re;
}
H 竟(语法基础)
注意之间两个空格,还一次pe可以
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n;
cin>>n;
for(int i=1;i<=n;i++)
if(i%2!=0&&i%5!=0)
cout<<i<<" ";
}
I 成(枚举)
先把墙壁涂上色,然后把没有涂色的方格进行一次判断,如果左右两边都有墙壁的话,那么可以把这一部分涂色另一种颜色,最后找出颜色数量即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
ll bk[1000][1000],bk1[1000][1000];
ll n,re=0;
void dfs(int x,int y)
{
int f=0,ff=0;
for(int i=y;i>=0;i--)
if(bk[x][i])
{
f=1;
break;
}
for(int i=y;i<n;i++)
if(bk[x][i])
{
ff=1;
break;
}
if(f&&ff)
{
for(int i=y;i>=0;i--)
if(!bk[x][i])
bk1[x][i]=1;
else
break;
for(int i=y;i<n;i++)
if(!bk[x][i])
bk1[x][i]=1;
else
break;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>num[0];
sum[0]=num[0]%10;
for(int i=1;i<n;i++)
num[i]=(num[i-1]*6807+2831)%201701,sum[i]=num[i]%10;
for(int i=0;i<n;i++)
for(int j=0;j<sum[i];j++)
bk[j][i]=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(!bk[i][j])
dfs(i,j);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(bk1[i][j])
re++;
cout<<re;
}
J 新年加油(无语)
上来直接输出就行,然后都错了。大家都错了,后来听qut的说要用Unicode的才行,然后才ac之后又重判了。。。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cout<<"I
W
i
l
l
t
r
y
m
y
b
e
s
t
f
o
r
2
0
1
9
!";
}