#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int n,m,q; int u,v,w; int len1,len2; int qu[101000]; struct daolu { int y; int next; int vv; }e[101000],f[101000]; int dis[3010]; int ans[3010]; bool vis[3010]; int lin[3010]; int linn[3010]; void insert(int xx,int yy,int zz) { e[++len1].next=lin[xx]; lin[xx]=len1; e[len1].y=yy; e[len1].vv=zz; } void inserts(int xx,int yy,int zz) { f[++len2].next=linn[xx]; linn[xx]=len2; f[len2].y=yy; f[len2].vv=zz; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); insert(u,v,w); inserts(v,u,w); } memset(dis,10,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[1]=0;vis[1]=1;qu[1]=1; int head=0,tail=1; while(head<tail) { int tn=qu[++head];vis[tn]=0; for(int i=lin[tn];i;i=e[i].next) { int tmp=e[i].y; if(dis[tn]+e[i].vv<dis[tmp]) { dis[tmp]=dis[tn]+e[i].vv; if(!vis[tmp]) { qu[++tail]=tmp; vis[tmp]=1; } } } } memset(vis,0,sizeof(vis)); memset(ans,10,sizeof(ans)); memset(qu,0,sizeof(qu)); ans[1]=0;vis[1]=1;qu[1]=1; head=0,tail=1; while(head<tail) { int tn=qu[++head];vis[tn]=0; for(int i=linn[tn];i;i=f[i].next) { int tmp=f[i].y; if(ans[tn]+f[i].vv<ans[tmp]) { ans[tmp]=ans[tn]+f[i].vv; if(!vis[tmp]) { qu[++tail]=tmp; vis[tmp]=1; } } } } int a,b; scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d",&a,&b); if(dis[b]+ans[a]<1000000) cout<<dis[b]+ans[a]<<endl; else cout<<-1<<endl; } return 0; }
#include<cstdio> #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n; struct xiaodui { int r; int b; }d[101000]; unsigned long long temp; unsigned long long sum; bool mycmp(xiaodui a,xiaodui c) { return a.b<c.b; } int main() { freopen("expedition.in","r",stdin); freopen("expedition.out","w",stdout); scanf("%d",&n); int x,y; for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); d[i].r=x; d[i].b=y; } sort(d+1,d+n+1,mycmp); int flag=d[1].b; for(int i=1;i<=n;i++) { if(d[i].b==flag) { temp+=d[i].r; } else { sum+=temp*temp; temp=d[i].r; flag=d[i].b; } } sum+=temp*temp; cout<<sum<<endl; return 0; }
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #include<utility> 8 #include<stdio.h> 9 #include<cstdlib> 10 #include<iomanip> //cout<<setiosflags(ios::fixed)<<setprecision(2); 11 #include<ctime> //double a=(double)clock(); cout<<a<<endl; 12 #include<vector> 13 #include<queue> 14 using namespace std; 15 int read(){ 16 int x=0,ff=1;char ch=getchar(); 17 while(ch>'9'||ch<'0'){if(ch=='-')ff=-1; ch=getchar();} 18 while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} 19 return ff*x; 20 } 21 const int MOD=10007; 22 struct bignum{ 23 int num[510]; 24 int len; 25 void clear() 26 {len=0,memset(num,0,sizeof(num));} 27 void print(){ 28 printf("%d\n",len); 29 for(int i=0;i<=len;i++){ 30 if(num[i]<0) 31 num[i]+=MOD; 32 printf("%d\n",num[i]); 33 } 34 } 35 bignum friend operator+(const bignum&A,const bignum&B){ 36 bignum C; 37 C.len=max(A.len,B.len); 38 for(int i=0;i<=C.len;i++){ 39 if(i>A.len) 40 C.num[i]=B.num[i]; 41 else if(i>B.len) 42 C.num[i]=A.num[i]; 43 else 44 C.num[i]=(A.num[i]+B.num[i])%MOD; 45 } 46 while(C.num[C.len]==0&&C.len) 47 C.len--; 48 return C; 49 } 50 bignum friend operator-(const bignum&A,const bignum&B){ 51 bignum C; 52 C.len=max(A.len,B.len); 53 for(int i=0;i<=C.len;i++){ 54 if(i>A.len) 55 C.num[i]=-B.num[i]; 56 else if(i>B.len) 57 C.num[i]=A.num[i]; 58 else 59 C.num[i]=(A.num[i]-B.num[i])%MOD; 60 } 61 while(C.num[C.len]==0&&C.len) 62 C.len--; 63 return C; 64 } 65 bignum friend operator*(const bignum&A,const bignum&B){ 66 bignum C; 67 C.clear(); 68 for(int i=0;i<=A.len;i++) 69 for(int j=0;j<=B.len;j++){ 70 int k=i+j; 71 C.num[k]+=A.num[i]*B.num[j]; 72 C.num[k]%=MOD; 73 if(k>C.len&&C.num[k]!=0) 74 C.len=k; 75 } 76 return C; 77 } 78 }p[1010],t;//多项式栈 79 char s[1010]; 80 int N; 81 char op[1010];//operator 运算符栈 82 int to,tp; 83 inline int grade(char c){ 84 if(c=='+'||c=='-') 85 return 1; 86 else if(c=='*') 87 return 2; 88 else 89 return 0; 90 } 91 int main(){ 92 freopen("simplify.in","r",stdin); 93 freopen("simplify.out","w",stdout); 94 gets(s+1); 95 N=strlen(s+1); 96 for(int i=1;i<=N;i++){ 97 if(s[i]=='x'){ 98 tp++; 99 p[tp].len=1; 100 p[tp].num[0]=0; 101 p[tp].num[1]=1; 102 } 103 else if(s[i]>='0'&&s[i]<='9'){ 104 int j=i,temp=0; 105 while(s[j]>='0'&&s[j]<='9'){ 106 temp=temp*10+s[j]-'0'; 107 j++; 108 } 109 tp++; 110 p[tp].len=0; 111 p[tp].num[0]=temp; 112 i=j-1; 113 } 114 else{ 115 if(s[i]=='(') 116 op[++to]=s[i]; 117 else if(s[i]==')'){ 118 while(to&&op[to]!='('){ 119 tp--; 120 if(op[to]=='+') 121 p[tp]=p[tp]+p[tp+1]; 122 else if(op[to]=='-') 123 p[tp]=p[tp]-p[tp+1]; 124 else 125 p[tp]=p[tp]*p[tp+1]; 126 to--; 127 } 128 to--; 129 } 130 else{ 131 while(to&&grade(op[to])>=grade(s[i])){ 132 tp--; 133 if(op[to]=='+') 134 p[tp]=p[tp]+p[tp+1]; 135 else if(op[to]=='-') 136 p[tp]=p[tp]-p[tp+1]; 137 else 138 p[tp]=p[tp]*p[tp+1]; 139 to--; 140 } 141 op[++to]=s[i]; 142 } 143 } 144 } 145 while(to){ 146 tp--; 147 if(op[to]=='+') 148 p[tp]=p[tp]+p[tp+1]; 149 else if(op[to]=='-') 150 p[tp]=p[tp]-p[tp+1]; 151 else 152 p[tp]=p[tp]*p[tp+1]; 153 to--; 154 } 155 p[tp].print(); 156 return 0; 157 }
T1
远征
【题目描述】
寒枫将军将要带领他的部队去圣雪山消灭那里的冰龙。
部队分成了若干个小队,属于同一个小队的人兵种相同。寒枫将军有着杰出的指挥能力,在战斗的时候,寒枫将军能够让所有相同兵种的人互相配合,使t个相同兵种的人发挥出t2的战斗力;寒枫将军还能让不同兵种的人互相配合,使整个部队的战斗力是所有兵种战斗力的和。
例如,部队中有3个小队,分别是5个人的步兵小队,3个人的步兵小队,3个人的骑兵小队。那么步兵战斗力为64,骑兵战斗力为9,部队总战斗力为73。
寒枫将军需要知道他的部队的战斗力是多少。
【输入格式】
第一行一个整数n,表示小队数。接下来n行,第i行有两个整数ai、bi,表示这个小队有ai个人,兵种为bi。
【输出格式】
一行一个整数,部队的战斗力。
【样例输入】
3
5 1
3 1
3 2
【样例输出】
73
【数据规模与约定】
10%的数据,n=1
30%的数据,n≤1000
另有20%的数据,ai=1
另有30%的数据,bi≤1000
100%的数据,1≤n≤100000,1≤ai≤10000,1≤bi≤1,000,000,000
:在我拿到这道题的时候,大致一看,发现只是一个加和乘的问题,心想不会这么水吧。再看下数据,bi好像有点大,我因为有着上次爆空间的教训,知道如果直接开数组一定会爆炸。简单思考一下,这道题用结构体排序写。先不管人数,全部存起来,然后进行排序,把队号一样的加起来就好了。但是n是小于等于100000的,而ai又是小于等于10000的,如果相乘也就是10^9,如果再开平方,就是10^18.当时我果断认为这是一道高精度的题,然后我就蔫儿了。高精度实在恶心,我索性打了unsigned long long 。结果中午吃饭的时候学长告诉我,long long的范围就够了。所以拿了满分。那么,我这次该记住了,int的范围是2147483647,然后long long是int的平方,也就是9223372036854775807。粗略一算,绰绰有余。
T2
化简
【题目描述】
给出一个表达式,包含数字、未知数x、“+”、“-”、“*”和括号。把它化简成a0x0+a1x1+a2x2+……+anxn的形式。
【输入格式】
一行一个字符串,即表达式。
【输出格式】
第一行一个非负整数n,接下来n+1个数,其中第i行为ai-1。由于ai可能很大,对10007取模后输出。
若有多个n满足条件,输出最小的n。
【样例输入】
(x-2)*3+x
【样例输出】
1
10001
4
【数据规模与约定】
测试点 | 输入长度不超过 | 对于乘号 | 对于括号 | 对于未知数x |
0 | 3 |
| 没有 | 没有 |
1 | 100 |
| 没有括号套括号的情况 | 没有 |
2 | 100 | 没有 |
| 没有 |
3 | 100 |
|
| 没有 |
4 | 1000 |
|
| 没有 |
5 | 1000 | 没有 | 没有 |
|
6 | 1000 |
| 没有 |
|
7 | 1000 | 没有 |
|
|
8 | 100 |
| 没有括号套括号的情况 |
|
9 | 1000 |
|
|
|
上表中没有填写的格子,表示数据在那一方面没有特殊限制。
保证输入的表达式合法。
保证表达式中出现的数字小于10007。
表达式中没有“6x”这种形式。即数字和未知数之间至少存在一个符号。
:学长说这道题是高精度与多项式求值的组合,确实十分恶心。不过仔细看一下数据,有很多分还是可以拿到的。第一组数据,字符串长度只有3,且没有未知数,那么一定是两个数的加减乘。1~5组数据都是没有未知数x的,就相当于多项式求值。其实这个我当时是意识到的,但是栈这个一块儿的知识我并没有学好,所以没有写出来。然后第六组数据,没有括号,没有乘号,直接从左到右做计算就可以。所以至少拿60分。
记得肖帆曾经就给我讲过,闵子轩学长说过,写题不看数据就是耍无赖。数据对题是十分重要的,每一道题就算你想不出来正解,也可以依靠数据分部解出来。
T3
生产
【题目描述】
工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划。那么,就经常会有生产部门要把产品送到另一个生产部门作为原料。这是一个注重产品质量的工厂,所以每当有产品要从A部门运到B部门时,都要先从A部门送到质量检验处,检验合格后再从质量检验处运到B部门。
有些部门之间有传送带连接,厂长想知道每次将产品从一个部门运送到另一个部门最少需要多长时间。
【输入格式】
第一行两个整数n、m,n表示部门数量,m表示传送带数量。出于方便,1号部门是质量检验处。
接下来m行,每行三个整数u、v、w,表示有一条从u部门到v部门的传送带,传送过去需要w个单位时间。注意传送带是单向的。
接下来一个整数q,表示有q次运送。
接下来q行,每行两个数a、b,表示这一次要将产品从a部门运送到b部门。
【输出格式】
输出q行,每行一个整数,表示这次运送最少需要的时间。若没有传送方案,输出-1。
【样例输入】
5 5
1 2 3
1 3 5
4 1 7
5 4 1
5 3 1
3
4 2
5 3
2 3
【样例输出】
10
13
-1
【数据规模与约定】
30%的数据,n≤100,m≤500,w=1
60%的数据,n≤100,m≤5000
另20%的数据,q=1
100%的数据,2≤n≤3000,m≤100000,2≤a,b≤n,
q≤100000,1≤u,v≤n,1≤w≤10000
有些部门之间可能有多条传送带。
工厂的员工都非常尽职尽责,他们的认真和热情决定了产品的完美,所以不必考虑产品不合格的情况。
:最开始,我有种想要用弗洛伊德算法的冲动,但是考虑到n<=3000,还是算了吧。(现在想想,当时果断一些,60分就到手了)因为我知道还有一种算法,如果是求单源点的最短路径的话,比弗洛伊德优很多。这种算法叫做SPFA,但是因为在OJ上的题刷的很少,我从未用过这种算法,直接照书敲的,粗心的我敲错了一个地方,所以爆零。我吸取一个教训,当遇到自己没把握的题的时候,尽量不要冒险,想要写出正解拿到更多的分,有时候太贪心,往往会什么也得不到。
这次考试,我的后两题都是零分,这是有原因的,首先沉不住气,觉得麻烦就不想写。然后就是知识不牢固,还像之前一样,代码总是存在小错误。代码实现能力真的有待提高,所以我要反思。
高一的下学期,我希望可以把第二本书的内容牢牢掌握,听学长说这还远远不够。所以,我更应该努力了。