51Nod-1103-N的倍数
来源:互联网 发布:php crm 开源 编辑:程序博客网 时间:2024/06/06 00:36
ACM模版
描述
题解
利用抽屉原理解题。
把前缀和求出并对N
取模,任意等于0
则符合要求,或者任意两个sum[i]=sum[j]
,则[i,j]
内的数的和都满足这个条件。
N
个数对N
取模,相当于N
个抽屉,则至少有一个sum[i]
等于0,或者一对儿sum[i]==sum[j]
(可以理解为sum[i]-sum[j]==0
)。
这是一道特判题,可能有多种解,所以即使输出结果和样例不同,仍然是可以AC的,之前因为没有关注过特判题,所以,纳闷儿了半天(为毛样例都不对却AC了)……
最后说明一点,其实No Solution
这种情况完全不用考虑,一定有解!
代码
#include <iostream>#include <cstdio>typedef long long ll;using namespace std;const int MAXN = 5e4 + 10;int A[MAXN];ll sum[MAXN];int main(int argc, const char * argv[]){ int N; while (cin >> N) { int flag = 0; sum[0] = 0; for (int i = 1; i <= N; i++) { scanf("%d", A + i); sum[i] = (sum[i - 1] + A[i]) % N; if (sum[i] == 0) // 从1~相加符合 { flag = i; } } if (flag) // 输出结果并continue { printf("%d\n", flag); for (int i = 1; i <= flag; i++) { printf("%d\n", A[i]); } continue; } int left = 0, right = 0; for (int i = 1; i <= N; i++) { for (int j = i + 1; j <= N; j++) { if (sum[i] == sum[j]) { left = i + 1; right = j; flag = j - i; // 查找到结果 break; } } if (flag) // 查找到则跳出 { break; } } if (flag) { printf("%d\n", flag); for (int i = left; i <= right; i++) { printf("%d\n", A[i]); } } else { printf("No Solution\n"); } } return 0;}
0 0
- 51Nod-1103-N的倍数
- 51Nod 1103 N的倍数
- 【51Nod 1103】N的倍数
- 51nod 1103 N的倍数
- 51nod 1103 n的倍数
- 51nod 1103 N的倍数
- 51Nod 1103 N的倍数
- 51nod 1103 N的倍数
- 51nod-1103-N的倍数
- 51Nod 1103 N的倍数
- 51nod 1103 N的倍数 (抽屉原理)
- 51nod 1103:N的倍数 抽屉原理
- 51nod 1103 N的倍数 (抽屉原理)
- 51 nod 1103 N的倍数(鸽巢原理)
- 51NOD 1103 N的倍数(抽屉原理)
- 51nod-1103 N的倍数(抽屉原理)
- 51nod 1103 N的倍数 (抽屉原理)
- 51nod 1103 N的倍数(抽屉定理)
- lua 游戏开发_技能定义字段
- NBUT 1668 反函数
- 菜鸟学习见解(1)
- Leetcode 8. String to Integer (atoi)
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- 51Nod-1103-N的倍数
- 图解Oracle用户管理
- 第九轮回 没有卵用的寻求帮助
- Simple Line Editor
- c++四种强制类型转化的区别
- 网站排名的基本原则
- Activity launchMode详解
- HDU 5519(Kykneion asma-NNT+CRT)
- 二维数组翻转