A B题用python
A
1576
B
781448427
C
打表找规律
#include<bits/stdc++.h>
bool fun(int n)
{
for(int i=-100;i<=100;++i)
{
int sum=0;
for(int j=i;j<=200;++j)
{
sum+=j;
if(j-i>3&&sum==n) return 1;
}
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
if(fun(i)) printf("%d:yes\n",i);
else printf("%d:no\n",i);
}
return 0;
}
写完上面也能想到怎么证明了
提交:
#include<bits/stdc++.h>
int main()
{
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int x;
scanf("%d",&x);
if(x>=2) ++ans;
}
printf("%d\n",ans);
return 0;
}
洛谷评测:100
D
#include<bits/stdc++.h>
typedef long long LL;
void fun(LL a,LL b,LL c,LL k)
{
for(int i=1;i<=k;++i)
{
int ta=b+c>>1;
int tb=a+c>>1;
int tc=a+b>>1;
if(ta==a&&tb==b&&tc==c) break;
a=ta;
b=tb;
c=tc;
}
printf("%lld %lld %lld\n",a,b,c);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
LL a,b,c,k;
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
fun(a,b,c,k);
}
return 0;
}
/*
int main()
{
for(int i=0;i<=100;++i)
{
printf("k=%d:",i);
fun(100,200,300,i);
}
return 0;
}
*/
/*
int main()
{
for(int i=1;i<=100000;++i)
{
fun(1,1,1000000000,1000000000);
}
return 0;
}
*/
应该不会TLE,洛谷100分
E
#include<bits/stdc++.h>
using std::sort;
using std::min;
typedef long long LL;
const int N=1e5+10;
const LL INF=0x3f3f3f3f3f3f3f3f;
LL arr[N],t[N],s[N];//t[i] presents abs(arr[i]*arr[i]-arr[i-1]*arr[i-1])
LL abs(LL x)
{
return x>0?x:-x;
}
LL getL(int l,int r)//from [l,r] get L
{
LL ans=0;
for(int i=l+1;i<=r;++i) ans+=abs(arr[i]*arr[i]-arr[i-1]*arr[i-1]);
return ans;
}
void fun()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%lld",&arr[i]);
sort(arr+1,arr+n+1);
for(int i=2;i<=n;++i)
{
t[i]=abs(arr[i]*arr[i]-arr[i-1]*arr[i-1]);
s[i]=s[i-1]+t[i];//s[i] presents sum of t[i]
//printf("%d ",s[i]);
}
LL ans=INF;
for(int i=1;i+m-1<=n;++i)
// cal the ans from i to i-m+1
ans=min(ans,s[i+m-1]-s[i]);
printf("%lld\n",ans);
}
int main()
{
fun();
return 0;
}
//ex:4 2 1 2 4 5
//ex:10 5 1 2 3 4 5 6 7 8 9 10
//ex:10 5 1 34 35 36 37 38 39 40 41 42
E本地测试
#include<bits/stdc++.h>
using std::sort;
using std::min;
typedef long long LL;
const int N=1e5+10;
const LL INF=0x3f3f3f3f3f3f3f3f;
LL arr[N],t[N];//t[i] presents abs(arr[i]*arr[i]-arr[i-1]*arr[i-1])
LL abs(LL x)
{
return x>0?x:-x;
}
LL getL(int l,int r)//from [l,r] get L
{
LL ans=0;
for(int i=l+1;i<=r;++i) ans+=abs(arr[i]*arr[i]-arr[i-1]*arr[i-1]);
return ans;
}
void fun()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%lld",&arr[i]);
sort(arr+1,arr+n+1);
LL ans=INF;
for(int i=1;i+m-1<=n;++i)
{
ans=min(ans,getL(i,i+m-1));
}
for(int i=1;i+m-1<=n;++i)
{
if(ans==getL(i,i+m-1))
{
for(int j=i;j<=i+m-1;++j)
{
printf("%lld ",arr[j]);
}
printf("\n");
return;
}
}
}
int main()
{
fun();
return 0;
}
//ex:4 2 1 2 4 5
//ex:10 5 1 2 3 4 5 6 7 8 9 10
//ex:10 5 1 34 35 36 37 38 39 40 41 42
洛谷CE了,abs不是std::abs,dev正常。直接冲突编译错误,希望蓝桥杯的测试环境也是windows吧,如果是linux我就完蛋了
如果改掉CE是100
F
应该是不难的dp
#include<bits/stdc++.h>
using std::string;
using std::cin;
using std::cout;
using std::endl;
const int N=1e6+10;
int dp[N];
bool check(int casecheck,char a,char b,char c,char d)
{
switch(casecheck)
{
case 1:if(a=='#'&&b=='.'&&c=='.'&&d=='#') return 1;else return 0;break;
case 2:if(a=='#'&&b=='.'&&c=='#'&&d=='.') return 1;else return 0;break;
case 3:if(a=='#'&&b=='.'&&c=='.'&&d=='.') return 1;else return 0;break;
case 4:if(a=='.'&&b=='.'&&c=='#'&&d=='.') return 1;else return 0;break;
case 5:if(a=='.'&&b=='#'&&c=='#'&&d=='.') return 1;else return 0;break;
default:return 0;
}
}
int main()
{
string str1,str2;
cin>>str1>>str2;
int index=0;
for(;str1[index]=='.'&&str2[index]=='.';++index);
for(int i=str1.length()-1;str1[i]=='.'&&str2[i]=='.';--i) str1[i]=str2[i]='#';
//cout<<str1<<endl<<str2<<endl;
//next we start dp
for(++index;index<str1.length();++index)
{
//case1:#..#
if(check(1,str1[index-1],str1[index],str2[index-1],str2[index]))
{
dp[index]=dp[index-1]+1;
str1[index]='#';
}
else if(check(2,str1[index-1],str1[index],str2[index-1],str2[index]))
{
dp[index]=dp[index-1]+1;
str1[index]='#';
str2[index]='#';
}
else if(check(3,str1[index-1],str1[index],str2[index-1],str2[index]))
{
dp[index]=dp[index-1]+1;
str1[index]='#';
}
else if(check(4,str1[index-1],str1[index],str2[index-1],str2[index]))
{
dp[index]=dp[index-1]+1;
str2[index]='#';
}
else if(check(5,str1[index-1],str1[index],str2[index-1],str2[index]))
{
dp[index]=dp[index-1]+1;
str2[index]='#';
}
else
{
dp[index]=dp[index-1];
//cout<<"case default"<<endl;
}
}
//cout<<str1<<endl<<str2<<endl;
printf("%lld\n",dp[str1.length()-1]);
return 0;
}
/*
eg;
.##.....#
.#.#.#...
5
.##......
.#.#.#...
2
*/
洛谷100
G
#include<bits/stdc++.h>
using std::vector;
using std::cout;
using std::endl;
using std::max;
using std::min;
using std::unordered_set;
typedef long long LL;
const int N=2e5+10,M=1e6+10;
int e[2*N],ne[2*N],h[2*N],idx=1,w[N],n,dp[M],du[N];
bool st[N];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int dfs(int node)
{
vector<int>vec;
if(st[node]) return w[node];
st[node]=1;
for(int i=h[node];i;i=ne[i])
{
vec.push_back(dfs(e[i]));
}
if(vec.size()==0)
{
//cout<<"node"<<node<<"returned"<<endl;
return w[node];
}
//dp
/*debug
cout<<"node:"<<node<<":";
for(auto x:vec) printf("%d ",x);
cout<<endl;
*/
memset(dp,0,sizeof dp);
for(int i=0;i<vec.size();++i)//第i样东西的价值为vec[i]
{
for(int j=w[node];j>=0&&j>=vec[i];--j)
{
if(dp[j-vec[i]]+vec[i]>=dp[j])
{
dp[j]=dp[j-vec[i]]+vec[i];
}
}
}
return dp[w[node]];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&w[i]);
for(int i=1;i<=n-1;++i)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
++du[a];
++du[b];
}
if(n==2) printf("%d\n",min(w[0],w[1]));
else if(n==3)
{
if(du[1]==1) printf("%d\n",min(w[1],w[2],w[3]));
else if(du[1]==2) printf("%d\n",min(w[1],max(min(w[1],w[2]+w[3]),w[2],w[3])));
}
else printf("%d\n",dfs(1));
return 0;
}
/*
9
9 7 3 7 1 6 2 2 7
1 2
1 3
2 4
2 5
2 6
6 7
6 8
6 9
*/
*/
这题也CE了,因为vector没有length方法,只有size,代码其他地方其实我都写的size,不知道怎么脑子一抽写了length
如果修了CE 洛谷55分
H
洛谷橙色,但我觉得不难
#include<bits/stdc++.h>
typedef long long LL;
const int N=1e5+10;
const int MOD=1e9+7;
LL arr[N],n,t[N],xornum[N];//t[N] qkpans xornum[i] presents sor of nums
LL qkp(LL a,LL b,LL c) //a^b%c
{
LL t=a;
a=1;
while(b)
{
if(b&1) a=a*t%c;
t=t*t%c;
b>>=1;
}
return a;
}
int main()
{
scanf("%lld",&n);
t[0]=1;
for(int i=1;i<=n;++i) t[i]=t[i-1]*3%MOD;
//for(int i=1;i<=n;++i) printf("%lld ",t[i]);
for(int i=1;i<=n;++i)
{
scanf("%lld",&arr[i]);
if(i==1) xornum[i]=arr[i];
else xornum[i]=xornum[i-1]^arr[i];
//printf("%lld ",xornum[i]);
}
LL ans=0;
for(int i=1,j=n-1;i<=n;++i,--j)
{
ans=(ans+(t[j]-t[j-1])*xornum[i])%MOD;
//printf("%lld\n",ans);
}
printf("%lld\n",ans);
return 0;
}
洛谷100
你这e为啥不会超时呢,on算的区间和,O.o
几乎满分也太厉害了
但是有2题编译错误