在一个有限的正整数序列中,有些数会多次重复出现。请你统计每个数的出现次数,然后按数字在序列中第一次出现的位置顺序输出数及其次数。
输出格式:
若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。
用了O(n^2)的方法,在两个平台上都满分通过了,所以只写了这个方法的解题思路。
#include
#include
int main() {
int N;
int a[50001], b[50001] = {
0 };
int count=1, i, j;
scanf("%d", &N);
for (i = 0; i < N; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < N; i++) {
if (b[i]==0) {
count = 1;//初始化
for (j = i + 1; j < N; j++) {
if (a[i] == a[j]) {
b[j] = 1;//标记出现过的数据
count++;//统计频率
}
}
printf("%d %d\n", a[i], count);
}
}
}
n个人围成一圈,从1开始依次编号,做报数游戏。 现指定从第1个人开始报数,报数到第m个人时,该人出圈,然后从其下一个人重新开始报数,仍是报数到第m个人出圈,如此重复下去,直到所有人都出圈。总人数不足m时将循环报数。请输出所有人出圈的顺序。
输入格式:
一行,两个整数n和m。n表示游戏的人数,m表示报数出圈的数字,1≤n≤50000,1≤m≤100.
输出格式:
一行,n个用空格分隔的整数,表示所有人出圈的顺序
输入样例:
在这里给出一组输入。例如:
if (i == n) {
i = 0; //从头开始数
}
#include
void left(int* a,int n,int m) {
int out = 0,count = 0,i = 0;
int *p = a;
int num = 0;
for(num = 0;num < n;num++) {
*(a+num) = num+1;//初始化
}
while (out < n-1) {
if (*(p+i) != 0) {
count ++;
}
if (count == m) {
//数到了第m个人
count = 0;//将count初始化,重新开始数
printf("%d ",*(p+i));
*(p+i) = 0;//将数到的人赋值为0,不计入循环
out++;
}
i++;
if (i == n) {
i = 0; //从头开始数
}
}
for (num = 0; num < n; num++) {
if (*(a+num) != 0) {
printf("%d\n",*(a+num));//最后剩下的人
}
}
}
int main()
{
long n;
int m;
long a[50000] = {
0};
scanf("%d",&n);
scanf("%d",&m);
left(a,n,m);
return 0;
}
任务: 计算算术表达式的值。
算术表达式按中缀给出,以=号结束,包括+,-,/四种运算和(、)分隔符。运算数的范围是非负整数,没有正负符号,小于等于109 。
计算过程中,如果出现除数为0的情况,表达式的结果为”NaN” ; 如果中间结果超出32位有符号整型范围,仍按整型计算,不必特殊处理。 输入保证表达式正确。
输入格式:
一行,包括1个算术表达式。算术表达式的长度小于等于1000。
输出格式:
一行,算术表达式的值 。
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
int first(char ch) {
int x = 0;
switch (ch) {
case '(':
x = 0; break;
case ')':
x = 0; break;
case '+':
x = 1; break;
case '-':
x = 1; break;
case '*':
x = 2; break;
case '/':
x = 2; break;
}
return x;
}
#include
#include
#include
#include
#include
#define maxsize 1001
using namespace std;
stack<char> s1;
stack<int> s2;
int first(char ch);
int yunsuan(int a, int b, char ch);
void result(char str[]);
int first(char ch) {
int x = 0;
switch (ch) {
case '(':
x = 0; break;
case ')':
x = 0; break;
case '+':
x = 1; break;
case '-':
x = 1; break;
case '*':
x = 2; break;
case '/':
x = 2; break;
}
return x;
}
int yunsuan(int a, int b, char ch)
{
int c = 0;
switch (ch)
{
case '+':
c = a + b;
break;
case '-':
c = a - b;
break;
case '*':
c = a * b;
break;
case '/':
if (b == 0)
{
cout << "NaN" << endl;
exit(0);
}
else
c = a / b;
break;
}
return c;
}
void result(char str[])
{
char num[maxsize];
char top1;
int f, c, get1, get2;
int j, i;
for (i = 0; str[i] != '='; i++)
{
switch (str[i])
{
case '(':
s1.push(str[i]);
break;
case '+':
case '-':
case '*':
case '/':
if ((s1.empty()))
s1.push(str[i]);
else if (first(str[i]) > first(s1.top()))
s1.push(str[i]);
else {
while (!s1.empty() && first(str[i]) <= first(s1.top()) && s1.top() != '(')
{
get1 = s2.top();
s2.pop();
get2 = s2.top();
s2.pop();
top1 = s1.top();
c = yunsuan(get2, get1, top1);
s1.pop();
s2.push(c);
}
s1.push(str[i]);
}
break;
case ')':
while (s1.top() != '(')
{
get1 = s2.top();
s2.pop();
get2 = s2.top();
s2.pop();
top1 = s1.top();
s1.pop();
c = yunsuan(get2, get1, top1);
s2.push(c);
}
s1.pop();
break;
default:
j = 0;
do
{
num[j++] = str[i];
i++;
} while (str[i] >= '0' && str[i] <= '9');
num[j] = '\0';
f = atoll(num);
i--;
s2.push(f);
break;
}
}
while (!s1.empty())
{
get1 = s2.top();
s2.pop();
get2 = s2.top();
s2.pop();
top1 = s1.top();
s1.pop();
c = yunsuan(get2, get1, top1);
s2.push(c);
}
printf("%d", s2.top());
}
int main() {
char str[maxsize];
scanf("%s", str);
result(str);
return 0;
}
小唐这段时间在研究序列。拿来N个整数的序列,他给序列中的每个整数都赋予一个喜爱值。喜爱值也是整数,有正有负,越大表明越喜欢。他想知道,如何从序列中连续取最多m个数,他获得喜爱值最大。1≤N≤500000,1≤m≤N。
输入格式:
第一行是两个整数N,m。分别代表序列中数的个数以及能取的最多个数。
第二行用空格隔开的N个整数,第i个整数Li代表他对第i个数的喜爱值。│Li│≤1000
输出格式:
一行,三个数,表示获得最大喜爱值,及第一个取最大喜爱值的区间。
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
for (int i = 1; i <= N; i++) {
cin >> array[i];
array[i] += array[i - 1];//记录前n项的和
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
deque<int> x;
int main() {
int N, m, front, rear;
cin >> N;
cin >> m;
int array[500001];
array[0] = 0;
for (int i = 1; i <= N; i++) {
cin >> array[i];
array[i] += array[i - 1];//记录前n项的和
}
int sum = 0;
while (!x.empty())
x.pop_back();
x.push_front(0);
for (int i = 1; i <= N; i++) {
while (!x.empty() && array[x.front()] > array[i]) {
//判断队列是否为空,弹出大于当前元素的节点的编号
x.pop_front();
}
x.push_front(i);//当前元素的编号入队
while (!x.empty() && i - x.back() > m) {
x.pop_back();
}
int tmp=array[i] - array[x.back()];
if (sum < tmp) {
//判断是否更新最大值
sum = tmp;
front = x.back() + 1;
rear = i;
}
}
cout<<sum<<" "<<front<<" "<<rear;
return 0;
}