目录
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a,x,b,y;
int d1=0,d2=0;
while(n--){
scanf("%d%d%d%d",&a,&x,&b,&y);
if(x==a+b&&y!=a+b){
d2++;
}else if(y==a+b&&x!=a+b){
d1++;
}
}
printf("%d %d",d1,d2);
return 0;
}
2.数组元素循环右移问题
1.记得取余,因为每移动6次就会恢复原来的顺序
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int n;
int m;
scanf("%d%d",&n,&m);
int martix[110];
for(int i=0;i<n;i++){
scanf("%d",&martix[i]);
}
int step=m%n;
int count=0;
for(int i=n-step;i<n;i++){
printf("%d",martix[i]);
count++;
if(count<n) printf(" ");
}
for(int i=0;i<n-step;i++){
printf("%d",martix[i]);
count++;
if(count<n) printf(" ");
}
return 0;
}
3.数字分类
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int n,martix[1003];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&martix[i]);
}
int x1=0,x2=0,count=0,x3=0,count2=0,x5=0;
bool flag1=false,flag2=false,flag3=false,flag4=false,flag5=false;
double x4;
for(int i=0;i<n;i++){
if(martix[i]%10==0){
flag1=true;
x1+=martix[i];
}
if(martix[i]%5==1){
flag2=true;
if(count%2==0) x2+=martix[i];
else x2-=martix[i];
count++;
}
if(martix[i]%5==2){
flag3=true;
x3++;
}
if(martix[i]%5==3){
flag4=true;
x4+=martix[i];
count2++;
}
if(martix[i]%5==4){
flag5=true;
if(martix[i]>x5){
x5 = martix[i];
}
}
}
double y4 = x4/count2;
if(flag1==true){
printf("%d ",x1);
}else{
printf("N ");
}
if(flag2==true){
printf("%d ",x2);
}else{
printf("N ");
}
if(flag3==true){
printf("%d ",x3);
}else{
printf("N ");
}
if(flag4==true){
printf("%.1lf ",y4);
}else{
printf("N ");
}
if(flag5==true){
printf("%d",x5);
}else{
printf("N");
}
return 0;
}
4.锤子剪刀布
字母的字典序即字母表的顺序
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int outcome(char a,char b){
if(a==b){
return 0;
}
else if((a=='C'&&b=='J')||(a=='J'&&b=='B')||(a=='B'&&b=='C')){
return 1;
}else{
return -1;
}
}
int get_num(char x){
if(x=='B') return 1;
else if(x=='C') return 2;
else return 3;
}
char str[6] = {'B','C','J'};
void print(int a[]){
int max_=-1,index=-1;
for(int i=1;i<=3;i++){
if(a[i]>max_){
index = i;
max_ = a[i];
}
}
printf("%c",str[index-1]);
}
int main(){
int n;
scanf("%d",&n);
getchar();
char a,b;
int w1=0,w2=0,e=0;
int index;
int num1[10002]={0},num2[10002]={0};
for(int i=0;i<n;i++){
scanf("%c %c",&a,&b);
getchar();
if(outcome(a,b)==0) e+=1;
else if(outcome(a,b)<0){
w2++;
index = get_num(b);
num2[index]++;
}
else{
w1++;
index = get_num(a);
num1[index]++;
}
}
printf("%d %d %d\n",w1,e,w2);
printf("%d %d %d\n",w2,e,w1);
print(num1);
printf(" ");
print(num2);
return 0;
}
5.Shuffling Machine
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int card[100];
int nexts[100]={0};
int martix[100],indexs,temp;
void permutation(){
for(int i=1;i<=54;i++){
indexs = martix[i];
nexts[indexs] = card[i];
}
for(int i=1;i<=54;i++){
card[i] = nexts[i];
}
}
int main(){
for(int i=1;i<=54;i++){
card[i] = i;
}
int n;
scanf("%d",&n);
for(int i=1;i<=54;i++){
scanf("%d",&martix[i]);
}
for(int i=0;i<n;i++){
permutation();
}
char c[7] = {'S','H','C','D','J'};
for(int i=1;i<=54;i++){
if(card[i]%13==0) printf("%c%d",c[card[i]/13-1],13);
else printf("%c%d",c[card[i]/13],card[i]%13);
if(i!=54){
printf(" ");
}
}
return 0;
}
6.Shortest Distance
这种写法最后一个样例会超时,但20分也可以拿17分
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int martix[100004];
for(int i=1;i<=n;i++){
scanf("%d",&martix[i]);
}
int m;
scanf("%d",&m);
int start,end;
while(m--){
scanf("%d %d",&start,&end);
int d1=0,d2=0;
if(start==end){
printf("0\n");
continue;
}else if(start>end){
int temp=end;
end = start;
start = temp;
}
for(int i=start;i<end;i++){
d1+=martix[i];
}
for(int i=end;i<=n;i++){
d2+=martix[i];
}
for(int i=1;i<start;i++){
d2+=martix[i];
}
if(d1>d2){
printf("%d\n",d2);
}else{
printf("%d\n",d1);
}
}
return 0;
}
这种方法就没有超时,需要在输入时就计算好每一站离终点的距离
有点动态规划的思想在里面
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int martix[100004]={0};
int value;
for(int i=1;i<=n;i++){
scanf("%d",&value);
martix[i] = martix[i-1] +value;
}
int m;
scanf("%d",&m);
int start,end;
while(m--){
scanf("%d %d",&start,&end);
if(start==end){
printf("0\n");
continue;
}else if(start>end){
int temp=end;
end = start;
start = temp;
}
int d1 = martix[end-1] - martix[start-1];
int d2 = martix[n-1] - martix[end-1] + martix[n] - martix[n-1] + martix[start-1] - martix[0];
if(d1<d2) printf("%d\n",d1);
else printf("%d\n",d2);
}
return 0;
}
7.A+B and C (64bit)
这一题涉及到了数字在底层的操作,比如两个整数如果过大,相加之后溢出会变成负数,反之亦然
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
long long a,b,c;
long long apb;
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&a,&b,&c);
apb=a+b;
if(a>0&&b>0&&apb<0) printf("Case #%d: true\n",i);
else if(a<0&&b<0&&apb>=0) printf("Case #%d: false\n",i);
else{
if(apb>c){
printf("Case #%d: true\n",i);
}else{
printf("Case #%d: false\n",i);
}
}
}
return 0;
}
8.一元多项式求导
首先,这种题目的输入需要用到EOF
其次,得考虑求导之后全是零的情况,否则会有两个样例无法通过
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int x=0,y=0;
}martix[100];
int main(){
int x,y,num=1;
while(scanf("%d%d",&x,&y)!=EOF){
martix[num].x=x;
martix[num++].y=y;
}
int count=0;
for(int i=1;i<num;i++){
martix[i-1].x = martix[i].x*martix[i].y;
martix[i-1].y = martix[i].y-1;
if(martix[i-1].x!=0){
count++;
}
}
if(count==0){
printf("0 0");
}else{
for(int i=0;i<num-1;i++){
if(martix[i].x!=0){
printf("%d %d",martix[i].x,martix[i].y);
count--;
if(count!=0) printf(" ");
}
}
}
return 0;
}