XJOI奋斗群群赛7解题报告+本周总结
原题
https://cn.vjudge.net/contest/184260
A - Bachgold Problem
题意
输入一个数n,求出最多能将其分解为多少质数和,并输出这些质数。
题解
水题,偶数分解为n/2个2,奇数分解为3和(n-3)/2个2即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,count=0;
cin>>n;
if(n%2==0){
cout<<n/2<<endl;
for(int i=1;i<=n/2;i++){
cout<<2<<" ";
}
}
else{
cout<<n/2<<endl;
for(int i=1;i<n/2;i++){
cout<<2<<" ";
}
cout<<3;
}
}
B - Parallelogram is Back
题意
输入平行四边形的3个点,输出第四个点可能的位置。
题解
水题,第四个点显然有三个位置,注意除2时用double即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
double x[100],y[100],c[100],d[100];
for(int i=1;i<=3;i++){
cin>>x[i]>>y[i];
}
c[1]=(x[1]+x[2])/2.0;
c[2]=(x[1]+x[3])/2.0;
c[3]=(x[2]+x[3])/2.0;
d[1]=(y[1]+y[2])/2.0;
d[2]=(y[1]+y[3])/2.0;
d[3]=(y[2]+y[3])/2.0;
cout<<3<<endl;
cout<<c[1]-(x[3]-c[1])<<" "<<d[1]-(y[3]-d[1])<<endl;
cout<<c[2]-(x[2]-c[2])<<" "<<d[2]-(y[2]-d[2])<<endl;
cout<<c[3]-(x[1]-c[3])<<" "<<d[3]-(y[1]-d[3])<<endl;
}
C - Voting
题意
n个人进行投票,分为两个党派,轮到某个有投票权人时,他可以否决另一个党派的人的投票权,按此循环直至剩下最后一个人,他的党派即胜利的党派。
题解
建两个队列,分别存储党派为D,R的人的编号,之后模拟否决的操作即可。
#include<bits/stdc++.h>
using namespace std;
char c[200010];
int num[200010];
int main() {
int n;
cin>>n;
memset(num,0,sizeof(num));
queue <int> d;
queue <int> r;
cin>>c;
for(int i=0; i<n; i++) {
if(c[i]=='D') d.push(i);
else r.push(i);
}
while(!d.empty()&&!r.empty()) {
for(int i=0; i<n; i++) {
if(num[i]) {
continue;
}
if(c[i]=='D') {
int temp1;
temp1=d.front();
d.pop();
int temp2;
temp2=r.front();
r.pop();
num[temp2]=1;
d.push(temp1);
} else {
int temp1;
temp1=r.front();
r.pop();
int temp2;
temp2=d.front();
d.pop();
num[temp2]=1;
r.push(temp1);
}
if(d.empty()||r.empty()) {
break;
}
}
}
if(!d.empty()) {
cout<<"D";
return 0;
} else {
cout<<"R";
return 0;
}
}
D - Secrets
题意
大意是一个国家,它的货币面值只有3的幂,给出一个n值,假设n无法由目前所有的硬币组合成,那么求在多花最少钱的情况下最多用多少枚硬币。
题解
n不断除3,若无法整除3,则等于n/3+1。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long int n,t,ans;
cin>>n;
if(n%3!=0){
ans=n/3+1;
}
else if(n%3==0){
t=3*3;
while(t){
if(t==n){
ans=1;
break;
}
if(n%t!=0){
ans=n/t+1;
break;
}
else{
t=t*3;
}
}
}
cout<<ans;
return 0;
}
E - Chips
题意
一个n*n的矩阵的边框上(不包括四个角落)放棋子,有m个不能过的点,要求每个棋子走到对面,棋子不能相撞,求最多棋子数。
题解
一个不能过的点可以废掉它所在一行和一列,其他行列不会影响。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000;
int a[MAXN]={0},b[MAXN]={0};
int main(){
int n,m;
cin>>n>>m;
int ans1=n-2,ans2=n-2;
int x,y;
for(int i=1;i<=m;i++){
cin>>x>>y;
a[x]=1;
b[y]=1;
}
for(int i=2;i<=n-1;i++){
if(a[i]==1) ans1--;
if(b[i]==1) ans2--;
}
int ans=ans1+ans2;
if(n%2==1&&a[(n+1)/2]==0&&b[(n+1)/2]==0) {
ans--;
}
cout<<ans;
}
本周总结
这周比赛的题目基本上AB是水题,后面的题目就比较难了,有比较多是要用到数据结构的,然而这块掌握的并不是特别好,其他的不足点还是有些粗心吧,包括数据范围和输出内容上还是时有错误,另外有些分类讨论的思维题也会考虑不全。还有就是心态问题,一题做不出来比较容易被卡住。下周,划水的AB题就要离我们而去了2333。
最后贴出czl和吴老师常说的话:学信息的人永不服输!
2017年9月10日