A - Plus One on the Subset
- 思路:看样例解释找规律可以发现:将数组进行排序,找出最大值和最小值,求差值即可
- 代码实现:
-
# include<bits/stdc++.h> using namespace std; int a[50],t; int main() { int m,sum; cin>>t; while(t--) { sum=0; memset(a,0,sizeof a); cin>>m; for(int i=1;i<=m;i++) cin>>a[i]; sort(a+1,a+m+1); sum=a[m]-a[1]; cout<<sum<<endl; } return 0; }
B - Make AP
-
-
思路:题目意思是三个数a,b,c(顺序不可改变),将其中任意一个数扩大m倍(m为整数)后的三个数是否可以构成等差数列。
-
思路:牢记数学等差公式a+c=2*b;然后分情况讨论到底是a,b,还是c扩大,求出扩大的那个数是否可以整除。
-
代码实现:
-
# include<bits/stdc++.h> using namespace std; int main() { int t,a,b,c; cin>>t; while(t--) { int flag=0; cin>>a>>b>>c; if((2*b>c&&(2*b-c)%a==0)||((2*b>a)&&(2*b-a)%c==0)||(a+c)%(2*b)==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
C - Division by Two and Permutation
-
题意 :题目意思是给出n个数,将这n个数依次进行除2处理,问能不能得到从1到n之间的所有数
思路:这题可以将数组元素从小到大排列并依次进行除2,只要除数小于n并且对应的标记数组没有被标记,就将对应的标记数组进行标记(对应的第一个元素就是最优解,不用担心多个元素抢一个元素映射)
代码实现:
# include<bits/stdc++.h>
using namespace std;
int a[60];
int bk[60];//标记数组;
int main()
{
int t,n;
cin>>t;
while(t--)
{
memset(bk,0,sizeof bk);
int flag=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,greater<int>());
for(int i=1;i<=n;i++)
for(int j=a[i];j!=0;j/=2)
{
if(j<=n&&!bk[j])
{
bk[j]=1;
break;
}
}
for(int i=1;i<=n;i++)
{
if(!bk[i])
{
cout<<"NO"<<endl;
break;
}
flag++;
}
if(flag==n) cout<<"YES"<<endl;
}
return 0;
}
D - Game
题意:1表示陆地,0表示水坑,只能踩陆地,问只能跳一次的情况下怎么才能使跨过的路径最短,输出那个最短路径的个数。
思路:在数组中先从前往后找第一个为0的下标,并标记为y,接着从后往前找第一个为0的下标,并标记为i,然后计算y-i+1即可。
代码实现:
# include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
int t,n,sum,y;
cin>>t;
while(t--)
{
sum=0;y=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n;i>0;i--)
{
if(a[i]==0)
{
y=i+1;
break;
}
}
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
sum=y-i+1;
break;
}
}
cout<<sum<<endl;
}
return 0;
}
G - Vasya and Coins
题意自己理解。
思路:先判断价值为1的硬币是否为0,如果为0,那他付不起的最小值为1;如果不为0,那就直接计算能支付的最大值,即价值为1的硬币数量乘以价值为2的硬币数量再加1即为答案。
代码实现:
# include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
ll a,b,sum=0;
cin>>n;
while(n--)
{
cin>>a>>b;
if(a==0) cout<<1<<endl;
else
{
sum=a*1+b*2+1;
cout<<sum<<endl;
}
}
return 0;
}
H - Vlad and Candies
题意:给出糖果的种类与数量,连续两天不吃同种糖果,问是否可以吃完。
思路:先将数组排序,如果只有一种糖果并且糖果只有一个,输出yes,如果不止一个糖果,输出no;如果不止一种糖果,则判断数量最多的那种糖果的数量减1是否大于数量第二多的那种糖果,如果大于,输出no,否则输出yes。
代码实现:
# include<bits/stdc++.h>
using namespace std;
const int N=2*1e5+10;
int a[N];
int main()
{
int t,n,sum=0;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
if(n==1&&a[0]>1) cout<<"NO"<<endl;
else if(n==1&&a[0]==1) cout<<"YES"<<endl;
else if(n>1)
{
sum=a[n-1]-1;
if(sum>a[n-2]) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
这次训练成绩不是很理想,别人都做出来了好多,我就做出几个找规律的题,差距真的很明显,哎,难受的一批,还得练啊。
最后附上题目链接:https://vjudge.net/contest/491405