一顿操作猛如虎,定睛一看20分……PAT A1046

这道题通过率只有0.29???比30分的还低,WTF兴冲冲,一看满分20……
奇了怪了……

#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;

int main()
{
	vector<int>dis, fr, bk;
	int n, temp, a, b;
	cin >> n;
	fr.resize(n + 1); fr[0]=0;
	bk.resize(n + 1); bk[n] = 0;
	for (int i = 0; i < n; i++)
	{
		scanf_s("%d", &temp);
		dis.push_back(temp);
		fr[i+1]=(fr[i ] + temp);//顺时针
	}

	for (int i = n - 1; i >= 0; i--)
	{
		bk[i]=(dis[i] + bk[i+1]);//逆时针
	}

	cin >> temp;//查询人数
	while (temp--)
	{
		scanf_s("%d %d", &a, &b);
		if (a > b) swap(a, b);
		cout << min(fr[b - 1] - fr[a - 1], bk[b - 1] + fr[a - 1]) << endl;
	}
	return 0;
}

画图就懂了的题,怕出界用了vector的resize,编译报错,惊讶的发现,resize之后,再push_back,长度又增加了……说明resize之后只能当数组用了,使用下标进行初始化,蛮有趣的。

O------------------------------------------------------------------------------------------------------------------------
然后做了1047,我一看通过率0.27,甚是惊奇,但是这个题不难啊…………为啥这么低通过率
随后我就知道为什么这么低的通过率了XD
cin不能用 会超时 那就scanf吧
我的电脑是vs2017 丫不能用scanf只能用scanf_s???WTF,同样的代码,放在vs2008不会崩溃,换2017就崩溃了……
Ok,fine.
最后在2008环境下调试的 最后一个超时 就是大家都用vector再排序,为什么不直接用set呢……难道是set造成的超时?
陈越太讨厌了+10086
放一个我倔强的21分的答案。

#include<stdio.h>
#include<set>
#include<string>
using namespace std;

int main()
{
	set<string>zju[2505];
	set<string>::iterator it;
	int n, m, num, id;
	string name;//备注里写个char版本  char name[40005][5]
	name.resize(5);//scanf前要resize
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		scanf("%s",&name[0]);//这个格式……   scanf("%s",name[i])
		scanf("%d",&num);
		while (num--)
		{
			scanf("%d", &id);
			zju[id].insert(name);
		}
	}
	bool flag = false;
	for (int i = 1; i <= m; i++)
	{
		if (!flag) flag = true;
		else printf("\n");
		int ll = zju[i].size();
		printf("%d %d\n", i, ll);
		flag = false;
		for (it = zju[i].begin(); it != zju[i].end(); it++)
		{
			if (!flag) flag = true;
			else printf("\n");
			name = *it;
			printf("%s", name.c_str());
		}
	}
	system("PAUSE");
	return 0;
}

经过验证,不是char和string的原因,就是set和vector的原因,OK,竟然sort会用时少,服了。
抄一个答案

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
char name[40010][5];
vector<int> zju[2510];
int cmp(int a, int b) {
	return strcmp(name[a], name[b]) < 0;//a<b返回1
}
int main() {
	int n, k;
	cin>>n>>k;
	for (int i = 0; i < n; i++) {
		int num, cid;
		cin>>name[i]>>num;
		for (int j = 0; j < num; j++) {
			cin>>cid;
			zju[cid].push_back(i);
		}
	}
	for (int i = 1; i <=k; i++) {
		cout << i << " " << zju[i].size() << "\n";
		sort(zju[i].begin(), zju[i].end(),cmp);
		for (int j = 0; j < zju[i].size(); j++)
			cout<<name[zju[i][j]]<<"\n";
	}
return 0;
}

C语言函数,strcmp我没用过,借这个机会学一下。参考博客

int strcmp(const char* str1, const char* str2);
其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。返回结果如下规定:
① str1小于str2,返回负值或者-1(VC返回-1);
② str1等于str2,返回0;
③ str1大于str2,返回正值或者1(VC返回1);

排序的话 sort(a,b,cmp) cmp自己定义 从小到大 那就return a<b 如此


更新:#define _CRT_SECURE_NO_WARNINGS
vs2015最开始 定义一下 可以使用scanf了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值