A - Phoenix and Balance
找规律的题,a[i]=a[i-1]*2+2;
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,m;
cin>>n;
for(int i=0;i<n;i++){
cin>>m;
m=m/2;
long long ans=0;
for(int j=0;j<m;j++){
ans = ans*2+2;
}
cout<<ans<<endl;
}
return 0;
}
B - Phoenix and Beauty
我们把所有数字塞到一个set里面,看看set的size是否小于k,也就是说看看不同的数的个数是否小于k,如果不,那就cout<<-1;即可。剩下的思路就是我们把那些不同的数字(就是塞到set里面的数字)复制n遍,然后要是这些数字不足k个我们就随便输出一些数字。
代码:
#include<bits/stdc++.h>
using namespace std;
set<int>::iterator it;
int a[10005];
int read() {
int ans=0,flag=1;
char ch=getchar();
while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
if(ch=='-') flag=-1,ch=getchar();
while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
return ans*flag;
}
set<int> S;
int main(){
int t,n,k;
cin>>t;
while(t--){
cin>>n>>k;
for(int i=1;i<=n;i++) {
int q;
scanf("%d",&q);
S.insert(q);
}
if(S.size()>k)
cout<<-1<<endl;
else {
cout<<n*k<<endl;
for(int i=1;i<=n;i++) {
for(it=S.begin();it!=S.end();++it) printf("%d ",*it);
for(int j=1;j<=k-S.size();j++) printf("1 ");
}
cout<<endl;
}
S.clear();
}
return 0;
}
这个题是看的题解,用循环节来做确实简单,自己的方法太复杂了,而且不容易做对。
代码(wa:case2):
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10005];
int read() {
int ans=0,flag=1;
char ch=getchar();
while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
if(ch=='-') flag=-1,ch=getchar();
while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
return ans*flag;
}
set<int> S;
int main(){
int b,c,d,t,n,k;
cin>>t;
while(t--){
cin>>n>>k;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
a[i]=read();
S.insert(a[i]);
}
if(S.size()>k)
cout<<-1<<endl;
if(n==k){
cout<<n+1<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<a[0]<<endl;
}
else{
for(int i=0;i+k<n&&n<10000;i++){
if(a[i+k]==a[i]){
continue;
}
else{
for(int j=n-1;j>=i+k;j--){
a[j+1]=a[j];
}
n++;
a[i+k]=a[i];
}
}
if(n>=10000){
continue;
}
else{
cout<<n<<endl;
for(int j=0;j<n-1;j++){
cout<<a[j]<<" ";
}
cout<<a[n-1]<<endl;
}
}
S.clear();
}
return 0;
}
C - Road To Zero
分情况讨论就行了,在类型的强制转换上wa了3发。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,m;
long long x,y,a,b;
long long ans=0;
cin>>n;
for(int i=0;i<n;i++){
ans=0;
cin>>x>>y;
cin>>a>>b;
if(b>a*2){
ans=(long long)(x+y)*a;
}
else{
ans=(long long)min(x,y)*b;
ans+=((long long)abs(x-y)*a);
}
cout<<ans<<endl;
}
return 0;
}
D - Binary Period
分两种情况:第一种是循环节是1的,这样直接输出就行了,第二种是循环节是2的,这种要么是01,要么是10;
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int t,c=1;
char s[1024];
scanf("%d ",&t);
while(t--){
c=1;
scanf("%s",&s);
for (int i=0;i<strlen(s)-1;i++){
if(s[i]!=s[i+1]){
c=0;
break;
}
}
if(c==1){
printf("%s\n",s);
}
else{
for(int i=0;i<strlen(s);i++) {
printf("10");
}
printf("\n");
}
}
return 0;
}
E - Nastya and Rice
简单模拟
代码:
include
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a,b,c,d,n,t;
scanf("%d",&t);
while (t--){
scanf("%d %d %d %d %d",&n,&a,&b,&c,&d);
if (n*(a+b)<(c-d)||n*(a-b)>(c+d)){
printf("No\n");
}
else{
printf("Yes\n");
}
}
return 0;
}
F - Nastya and Door
用前缀和来做,此题的坑是可能它没有山峰
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int s[200102];
int ss[200102];
int main(){
int b,c,d,t,n,x=0,y=0,z,k;
cin>>t;
while(t--){
y=0;z=1;
cin>>n>>k;
memset(s,0,sizeof(s));
memset(ss,0,sizeof(ss));
for(int i=1;i<=n;i++)
cin>>s[i];
for(int i=2;i<n;i++){
if(s[i]>s[i-1]&&s[i]>s[i+1])
ss[i]=1;
ss[i]+=ss[i-1];
}
for(int i=1;i+k-1<=n;i++){
int a=ss[i+k-2]-ss[i];
if(y<a){
y=a;
z=i;
}
}
printf("%d %d\n",y+1,z);
}
return 0;
}