这道题通过率只有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了……