codeforces 298A. Snow Footprints
分类讨论三种情况:
①..RRRRRR…
②..LLLLLLL…
③..RRRLLLL..
//AC by lwq:
#include<stdio.h> #include<algorithm> #include<string> #include<string.h> using namespace std; int main() { int n; scanf("%d",&n); char ss[1005]; scanf("%s",ss); int len=strlen(ss); int i; int begin,end; for(i=0;i<len;i++) { if(ss[i]==‘.‘) continue; else if(ss[i]==‘R‘) { begin=i; break; } else if(ss[i]==‘L‘) { end=i; break; } } if(ss[begin]==‘R‘) { for(i=begin+1;i<len;i++) { if(ss[i]==‘.‘) { end=i; break; } else if(ss[i]==‘L‘) { end=i-1; break; } else continue; } printf("%d %d",begin+1,end+1); } else if(ss[begin]==‘L‘) { for(i=len-1;i>=0;i--) { if(ss[i]==‘L‘) { begin=i; break; } else { continue; } } printf("%d %d",begin+1,end); } return 0; }
模拟。水题。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char q[100005]; int main() { int t,sx,sy,ex,ey; scanf("%d %d %d %d %d",&t,&sx,&sy,&ex,&ey); scanf("%s",q); int ans=0; bool f=false; for(int i=0;i<t;i++) { ans++; if(q[i]==‘E‘) { if(sx<ex) sx++; } else if(q[i]==‘S‘) { if(sy>ey) sy--; } else if(q[i]==‘W‘) { if(sx>ex) sx--; } else if(q[i]==‘N‘) { if(sy<ey) sy++; } if(sx==ex&&sy==ey) { f=true; break; } } if(f) printf("%d\n",ans); else printf("-1\n"); return 0; }
codeforces 382C. Arithmetic Progression
分类讨论:
先考虑特例:n = 1时,有无数组解,答案为 -1
然后根据存在的公差d的数量进行分类:
①d只有一种:
1.若d1 = 0,答案只有一种,输出a[1]
2.若d1为偶数并且只有两个数(n=2),则答案有三种:a[1] - d1, a[1]+d1/2, a[n] + d1 , 例如:2 4 -> 0 3 6
3.其他情况:答案有两种:a[1] – d1, a[n] + d1,例如:1 4 7 –> –2 10
②d有两种:d1, d2(设d2 > d1)
1.若d2 = 2 * d1 并且 cnt(d2) = 1(d2的数量只有一个),则答案只有一种:
根据d1, d2的顺序再分两小类:
(1)a[k]-d1(k为出现第二种公差的位置),例如:1 3 5 9 –> 7
(2)a[k-1]-d1,例如:-1 1 2 3 –> 0
2.其他情况:无解,答案为0
③d有三种以上:无解,答案为0
//AC by lyy:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<cmath> #include<queue> #include<limits.h> #define CLR(a,b) memset((a),(b),sizeof((a))) using namespace std; typedef long long ll; const int mod = 1e9+7; const int N = 1e5+5; const int inf = 0x3f3f3f3f; int n; ll a[N]; int main() { int i, j; ll d1 , d2; ll k; scanf("%d", &n); for(i = 1; i <= n; ++i) { scanf("%lld", &a[i]); } sort(a+1, a+1+n); int t; if(n == 1) {printf("-1\n"); return 0;} int cnt1 = 0, cnt2 = 0;//d1,d2数量 d1 = d2 = a[2] - a[1]; int f = 1;//只有d1 for(i = 2; i <= n; ++i) { if(f == 3) { printf("0\n"); return 0; }//有三个以上d t = a[i] - a[i-1]; if(t == d1) cnt1++; else if(t == d2) cnt2++; else if(t != d1 && f == 1) { cnt2++; d2 = t; f = 2; k = i;}//有d2 else if(t != d1 && t != d2 && f == 2) { f = 3; } } int ff = 1; if(d1 > d2) { ff = 2; swap(d1, d2); swap(cnt1, cnt2); } //d2 > d1 if(f == 1) { if(d1 == 0) {printf("1\n%lld\n", a[1]);} else if((d1 % 2 == 0) && n == 2 ) { printf("3\n%lld %lld %lld\n", a[1]-d1, a[1]+d1/2, a[n]+d1); } else { printf("2\n%lld %lld\n", a[1]-d1, a[n]+d1); } } else { //f = 2 if(d2 == 2*d1 && cnt2 == 1) { if(ff == 1) printf("1\n%lld\n", a[k]-d1); else printf("1\n%lld\n", a[k-1]-d1); } else printf("0\n"); } return 0; }
codeforces 450D. Jzzhu and Cities 【SPFA】
题意:有n个城市,编号1~n,已知有m条公路和k条铁轨, 保证从1号城市到其他城市距离最短,问可以关闭多少条铁轨。
题解:最短路,看着还有重边,想想SPFA的复杂度E log V,看着数据范围可以就直接用了。
将铁轨进行标记,对d数组进行初始化,并先入队列(刚开始想先求只有公路的最短路,最后考虑铁轨的思路 错误,因为可能有的城市最短路要经过铁路),然后SPFA啦,若是铁路的边被松弛,则对其进行标记,关闭这条铁轨。最后统计判断存在的铁轨数,将原铁轨数减去它就行了。
//yy:最近习惯用链式前向星,结果TLE了,想了想不对劲复杂度没问题啊,,后来经过各种折磨,换成vector存图就AC了,好气啊、姿势老错。。
//补题: AC by lyy
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<cmath> #include<queue> #include<limits.h> #define CLR(a,b) memset((a),(b),sizeof((a))) using namespace std; typedef long long ll; const int mod = 1e9+7; const int N = 1e5+5; const int M = 3e5+5; const ll inf = 0x3f3f3f3f3f3f3f3f; struct node { int v; int w; }E[2*M]; vector<node> ve[N]; int n, m, k; ll d[N]; bool vis[N]; bool train[N];//是否为铁路 queue<int> q; void spfa() { while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i = 0; i < ve[u].size(); ++i) { int v = ve[u][i].v; int w = ve[u][i].w; if(d[v] >= d[u] + w) { d[v] = d[u] + w; if(train[v]) { train[v] = false;//关闭这个铁轨 } if(!vis[v]) { vis[v] = true; q.push(v); } } } } } int main() { CLR(vis, 0); CLR(train, 0); int i, j; int u, v, w; scanf("%d%d%d", &n, &m, &k); for(i = 1; i <= n; ++i) { d[i] = inf; } d[1] = 0; vis[1] = 1; q.push(1); for(i = 1; i <= m; i ++) { scanf("%d%d%d", &u, &v, &w); ve[u].push_back(node{v, w}); ve[v].push_back(node{u, w}); } for(i = 1; i <= k; ++i) { scanf("%d%d", &v, &w); train[v] = true; if(d[v] > w) { d[v] = w; if(!vis[v]) { q.push(v); vis[v] = true; } } } spfa(); for(i = 1; i <= n; ++i) { if(train[i]) k--; } printf("%d\n", k); return 0; }
其他题都还做不出来,补都补不动orz