这周是进入实验室的第一周,在这周,了解了实验室的基本规章制度,然后还有平时的任务之类的,然后打了两次cf,熟悉了一下cf的题型,一般cf前三个题都是结论题,经常想不出就在那一直卡,然后打了两次都只做出一道题,结果不是很理想,然后还补了cf的题目,
#cf776
b题,
结论题,选择该公式的最大值时,我们可以选择取r-r%a-1,和r,l中的值进行选择,选择其中最大的一个值,同时我们还要注意在取r-r%a-1时,这个值是否超出边界,超出边界就不能选这个值。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--){
long long l,r,a;
cin>>l>>r>>a;
long long Max1=max(r/a+r%a,l/a+l%a);
long long k=r-r%a-1;
long long Max2=k/a+k%a;
if(l<=k) cout<<max(Max1,Max2)<<endl;
else cout<<Max1<<endl;
}
}
c题
就是排两遍序,一遍按权值排序,取前2*n个再进行下标排序。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int pos;
int x;
int w;
}num[200001];
bool cmp1(node a,node b)
{
return a.w<b.w;
}
bool cmp2(node a,node b)
{
return a.x<b.x;
}
int main()
{
int t;
cin>>t;
while(t--){
long long sum=0;
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>num[i].x>>num[i].w;
num[i].pos=i+1;
}
sort(num,num+m,cmp1);
for(int i=0;i<2*n;i++){
sum+=num[i].w;
}
sort(num,num+2*n,cmp2);
cout<<sum<<endl;
for(int i=0;i<n;i++){
cout<<num[i].pos<<' '<<num[2*n-i-1].pos<<endl;
}
}
}
D题
为了使移动次数最少,我们可以先从最大值开始移动,移动到合适位置时定下这个点,然后再移动剩下的数里面的最大值,即可使移动次数最小直到移动到1时停止移动。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int num[2001];
for(int i=0;i<n;i++){
cin>>num[i];
}
int Max=0;
int mp[2001];
int k=n;
int pos;
for(int i=n;i>=1;i--){
pos=0;
for(int j=0;j<i;j++){
if(num[j]==i) pos=j;
}
int aa[2001];
for(int j=0;j<i;j++){
aa[(i - 1 - pos + j) % i]=num[j];
}
for(int j=0;j<i;j++){
num[j]=aa[j];
}
if(i!=1) mp[i-1]=(pos+1)%i;
else mp[i-1]=0;
}
for(int i=0;i<n;i++){
cout<<mp[i]<<" ";
}
cout<<endl;
}
}
#124
结论题,当为3的n次方时,他的说法不成立。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int k;
int flag=0;
for(int i=0;i<n;i++){
k=pow(3,i);
if(k>=1e9){
flag=1;
break;
}
}if(flag==1)cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
long long x;
for(int i=0;i<n;i++){
int x=pow(3,i);
cout<<x<<" ";
if(i==n-1) cout<<endl;
}
}
}
}
然后打了天梯,感觉自己经常卡在一些很基础地方,所以导致有些应该做出来的题目做不出来,然后发现自己虽然学过了数据结构,但是出数据结构的题自己照样还是写不出来,挺不应该的,打算以后再认真复习一下数据结构的内容,夯实基础,下次天梯争取能多做一点题目。
算24
n个数算24,必有两个数要先算。这两个数算的结果,和剩余n-2个数,就构成了n-1个数求24的问题,然后枚举出所有的运算情况。
然后因为是double型所以不能用 ==
#include<bits/stdc++.h>
using namespace std;
double num[4];
#define EPS 1e-6;
bool same(double x)
{
return fabs(x) <= EPS;
}
bool Count(double *num,int n)
{
if(n==1) {
if(same(num[0]-24)) return true;
else return false;
}
double aa[5];
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
int ans=0;
for(int k=0;k<n;k++){
if(k!=i&&k!=j){
aa[ans++]=num[k];
}
}
aa[ans]=num[i]+num[j];
if(Count(aa,ans+1)) return true;
aa[ans]=num[i]-num[j];
if(Count(aa,ans+1)) return true;
aa[ans]=num[j]-num[i];
if(Count(aa,ans+1)) return true;
aa[ans]=num[i]*num[j];
if(Count(aa,ans+1)) return true;
if(!same(num[j])){
aa[ans]=num[i]/num[j];
if(Count(aa,ans+1)) return true;
}
if(!same(num[i])){
aa[ans]=num[j]/num[i];
if(Count(aa,ans+1)) return true;
}
}
}
return false;
}
int main()
{
while(1){
double num[4];
for(int i=0;i<4;i++){
cin>>num[i];
}
if(num[0]==0&&num[1]==0&&num[2]==0&&num[3]==0){
break;}
// if(Count(num[0])) cout<<"YES"<<endl,break;
if(Count(num,4)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
最长上升子序列
DP问题
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(num[i]>num[j]){
vis[i]=max(vis[i],vis[j]+1);
}
} len=max(len,vis[i]);
}
7-9 h0136. 在线翻译
开始因为输入要求后跟一个空白行卡了很久,然后也学习到了 可以用while(getline(cin,s)&&s!=""){
输入解决,getline可以输入空格,当字符串为空时循环输入结束。
7-7 h0093. 字符串最大跨距
因为用cin或者其他输入方式时,逗号会被字符串吸收掉,我们可以用
scanf("%[^,],%[^,],%s",s,s1,s2);
来解决,如果用其他的符号分隔也是可以的,注意中间要用逗号隔开。