codeforces gym-101078
题目链接:
http://codeforces.com/gym/101078
A:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bits/stdc++.h> #include <stack> #include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++) #define mst(ss,b) memset(ss,b,sizeof(ss)); #define ll long long; typedef long long LL; template<class T> void read(T&num) { char CH; bool F=false; for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar()); for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar()); F && (num=-num); } int stk[70], tp; template<class T> inline void print(T p) { if(!p) { puts("0"); return; } while(p) stk[++ tp] = p%10, p/=10; while(tp) putchar(stk[tp--] + '0'); putchar('\n'); } const LL mod=1e9+7; const double PI=acos(-1.0); const LL inf=1e18; const int N=1e6+2000; const int maxn=1e5+5; const double eps=1e-8; int a[maxn],p[maxn]; int main() { int t; read(t); while(t--) { int n; read(n); For(i,1,n) { read(a[i]); p[a[i]]=i; } int st=0,mmax=0,x; For(i,1,n) { read(x); mmax=max(mmax,p[x]); if(i==mmax) { printf("%d-%d ",st+1,i); st=i; } } printf("\n"); } return 0; } /* 题意: 给两个[1,n]的排列,现在要给分成几部分,每一部分里面都是数字相同,现在要怎么分; 思路: 水题啦啦; */
B:
C:
D:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bits/stdc++.h> #include <stack> #include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++) #define mst(ss,b) memset(ss,b,sizeof(ss)); #define ll long long; typedef long long LL; template<class T> void read(T&num) { char CH; bool F=false; for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar()); for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar()); F && (num=-num); } int stk[70], tp; template<class T> inline void print(T p) { if(!p) { puts("0"); return; } while(p) stk[++ tp] = p%10, p/=10; while(tp) putchar(stk[tp--] + '0'); putchar('\n'); } const LL mod=1e9+7; const double PI=acos(-1.0); const LL inf=1e18; const int N=1e6+2000; const int maxn=5e3+10; const double eps=1e-8; int main() { int t; read(t); while(t--) { LL n; read(n); if(n==0){cout<<"0\n";continue;} LL ans=n-n/2; for(int i=1;i<=3;i++) { if((n+i-1)%3==0) { LL t=(n+i-1)/3; if(t%2==0)t++; ans=ans+(n-t)/2+1; break; } } print(ans); } return 0; } /* 题意: 每个数m和2*m之间都有一根绳,每个奇数m和3*m+1之间有一根绳,现在要把[1,n]拿走,需要剪断多少根绳; 思路: 这个就是个水题,把2*m>n的减去,把3*m+1>n的剪去就是答案了; */
E:
F:
G:
H:
I:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bits/stdc++.h> #include <stack> #include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++) #define mst(ss,b) memset(ss,b,sizeof(ss)); #define ll long long; typedef long long LL; template<class T> void read(T&num) { char CH; bool F=false; for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar()); for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar()); F && (num=-num); } int stk[70], tp; template<class T> inline void print(T p) { if(!p) { puts("0"); return; } while(p) stk[++ tp] = p%10, p/=10; while(tp) putchar(stk[tp--] + '0'); putchar('\n'); } const LL mod=1e9+7; const double PI=acos(-1.0); const LL inf=1e18; const int N=1e6+2000; const int maxn=1e6+5; const double eps=1e-8; char s[maxn]; int p,sz; struct node { char ch; int l,r; }po[N]; void movele() { if(p==0)return ; p=po[p].l; } void moveri() { if(po[p].r==0)return ; p=po[p].r; } void insert(char &t) { sz++; po[sz].ch=t; po[sz].l=p; po[sz].r=po[p].r; po[p].r=sz; if(po[sz].r)po[po[sz].r].l=sz; p=sz; } void dele() { if(p==0)return ; if(po[p].r) { int nex=po[p].r; int pre=po[p].l; po[nex].l=pre; po[pre].r=nex; p=pre; } else { int pre=po[p].l; po[pre].r=0; p=pre; } } void out() { p=po[0].r; while(p) { printf("%c",po[p].ch); p=po[p].r; } printf("\n"); } int main() { int t; read(t); while(t--) { gets(s); int len=strlen(s); sz=0;p=sz; po[0].l=0;po[0].r=0; for(int i=0;i<len;i++) { if(s[i]=='<')movele(); else if(s[i]=='>')moveri(); else if(s[i]=='-')dele(); else insert(s[i]); } out(); } return 0; } /* 题意: 模拟几项操作,最后输出密码,其中<表示光标左移一位,>表示右移一位,-表示删除一位,其他的字符就表示插入一个字符, 这些操作都是在可以操作的情况下才执行; 思路: 用一个双向链表模拟一下,我不太会写链表,就用结构体代替啦; */
J:
K:
L:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bits/stdc++.h> #include <stack> #include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++) #define mst(ss,b) memset(ss,b,sizeof(ss)); #define ll long long; typedef long long LL; template<class T> void read(T&num) { char CH; bool F=false; for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar()); for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar()); F && (num=-num); } int stk[70], tp; template<class T> inline void print(T p) { if(!p) { puts("0"); return; } while(p) stk[++ tp] = p%10, p/=10; while(tp) putchar(stk[tp--] + '0'); putchar('\n'); } const LL mod=1e9+7; const double PI=acos(-1.0); const LL inf=1e18; const int N=1e6+2000; const int maxn=5e3+10; const double eps=1e-8; char s[maxn]; int main() { scanf("%s",s); int len=strlen(s); double ans=0; for(int i=len-1;i>=0;i--) { if(s[i]=='0') { for(int j=0;j<=i;j++) { if(s[j]=='1') { swap(s[i],s[j]); ans=ans+sqrt(i-j); break; } } } } printf("%.12lf\n",ans); return 0; } /* 题意: 给出一个01串,让把0都换到前边来,每次交换位置i和j的花费为sqrt(i-j);问最小的花费是多少; 思路: 假设现在位置i<j<x<y,i,j为1,x,y为1,sqrt(x-j)+sqrt(y-i)<sqrt(x-i)+sqrt(y-j), 这个大小关系可以通过平方啊比较出来,然后就是最外面的10一块交换花费最小,所以就这样贪心就好; */