题目大概的问题是:棋子当前离终点距离为K,筛子的个数为N,摇一次筛子记录一个点数,只有筛子点数和恰好为距离K时即成功到达终点,当没有到达终点时继续向前走,当点数和超过距离K时需要往回退超出的步数。
输入:第一行为K和N,第二行为N个筛子各自的点数;
输出:如果成功到达终点则输出字符串"paradox",如果没有则在一行输出距离终点的步长以及回退的次数。
代码如下:(AC为94%,剩下6%不知道扣在了哪里见谅)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void getTheIndex(int distance, int N, int* Di)
{
if (distance <= 0 || N <= 0 || Di == nullptr)
return;
int sum = 0;//走的步数和
int index = distance;//记录到达终点的距离
int backtimes = 0;//记录后退次数
for (int i = 0; i<N; ++i)//扫描筛子点数
{
sum += Di[i];
index = distance - sum;
if (sum == distance)
{
cout << "paradox" << endl;
return;
}
if (sum>distance)//sum需要重新计算
{
++backtimes;//后退数+1
sum = 2 * distance - sum;
//index=distance-sum;
index = -index;
}
}
cout << index << " " << backtimes << endl;
}
int main()
{
int K;
int N;
cin >> K >> N;
int* Di = new int[N];
for (int i = 0; i<N; ++i)
{
cin >> Di[i];
}
getTheIndex(K, N, Di);
return 0;
}