链接:http://codeforces.com/contest/670
A:7天内有连续5天工作2天休息,给你天数,问最少和最大可以休息的天数。
显然(1)开始就是工作时休息最少,(2)开始是休息时休息最多。(2)先把休息的减掉变成(1)。
#include <algorithm> #include <iostream> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> #include <ctime> #define INF 0x3f3f3f3f #define Mn 100010 #define Mm 200010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul (u<<1) #define ur (u<<1)|1 using namespace std; typedef long long ll; int main() { int n; cin>>n; int a=n/7; int ans=0; ans=2*a; int b=n-a*7; if(b>5) ans+=b%5; cout<<ans<<" "; if(n>=2) ans=2,n-=2; else ans=n,n=0; a=n/7; ans+=2*a; b=n-a*7; if(b>5) ans+=b%5; cout<<ans<<endl; return 0; }
B:
有n个机器人,每个机器人都有一个标识符,现在从第一个开始说出自己的标识符,接下来的每一个都要先把前面的重新报一遍。
题目给出第n个机器人报的标识符,求所有标识符第k个。
直接暴力找出k在第几个机器人,然后输出就行。
#include <algorithm> #include <iostream> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> #include <ctime> #define INF 0x3f3f3f3f #define Mn 100010 #define Mm 200010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul (u<<1) #define ur (u<<1)|1 using namespace std; typedef long long ll; int a[Mn]; int main() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int pos=0,x=0; for(int i=1;;i++) { if(i%2) pos=(i+1)/2*i; else pos=i/2*(i+1); if(pos>=k) break; x=pos; } x=k-x; cout<<a[x]<<endl; return 0; }
C:
有n个人看电影,每个人都会一种语言,m种电影,每种电影有音频和字幕,现在所有人想去看同一个电影,要求,听得懂音频的人最多的电影,
在这基础上选择看得懂字母最多的电影。
直接map标记。
#include <algorithm> #include <iostream> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> #include <ctime> #define INF 0x3f3f3f3f #define Mn 200010 #define Mm 200010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul (u<<1) #define ur (u<<1)|1 using namespace std; typedef long long ll; map<int,int> mp; int a[Mn],b[Mn]; int vis[Mn]; int main() { int n,x; scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&x); mp[x]++; } int m; scanf("%d",&m); int maxx=0; for(int i=1; i<=m; i++) { scanf("%d",&a[i]); maxx=max(maxx,mp[a[i]]); } for(int i=1; i<=m; i++) { if(mp[a[i]]==maxx) vis[i]=1; } maxx=0; int ans=0; for(int i=1; i<=m; i++) { scanf("%d",&b[i]); if(vis[i]) { if(mp[b[i]]>=maxx) { ans=i; maxx=mp[b[i]]; } } } printf("%d\n",ans); return 0; }
D1:小数据
D2:
现在要做饼干,需要n种原料,每种原料有不同的需求量,现在给你每种原料的初始量,和一些魔法值,每个魔法值可以任意转换成1克某种原料。
求最多可以多少饼干。
二分答案,判断是否可行。
#include <algorithm> #include <iostream> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> #include <ctime> #define INF 0x3f3f3f3f #define Mn 100010 #define Mm 200010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul (u<<1) #define ur (u<<1)|1 using namespace std; typedef long long ll; ll a[Mn]; ll b[Mn]; ll n; bool sl(ll mid,ll k) { for(int i=1;i<=n;i++) { if(b[i]/a[i]<mid) { k-=mid*a[i]-b[i]; if(k<0) return 0; } } return 1; } int main() { ll k; scanf("%I64d%I64d",&n,&k); for(int i=1;i<=n;i++) { scanf("%I64d",&a[i]); } for(int i=1;i<=n;i++) { scanf("%I64d",&b[i]); } ll l=1,r=1e10; ll ans=0; while(l<r) { ll mid=(l+r)>>1; if(sl(mid,k)) { ans=mid; l=mid+1; } else r=mid; } printf("%I64d\n",ans); return 0; }
E:
给你一些括号串,一些操作:'L' 'R' 'D',光标向左移动,向右移动,删除该括号和与该括号匹配的中的所有括号,给你光标初始位置,求最后的括号串。
用数组模拟双向链表,然后我么就可以在O(1)时间内移动光标了.
#include <algorithm> #include <iostream> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> #include <ctime> #define INF 0x3f3f3f3f #define Mn 500010 #define Mm 200010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul (u<<1) #define ur (u<<1)|1 using namespace std; typedef long long ll; int pre[Mn],ne[Mn]; int sk[Mn],top,mp[Mn]; char s[Mn],q[Mn]; int main() { int n,m,p; scanf("%d%d%d",&n,&m,&p); for(int i=0; i<n; i++) { pre[i]=i-1; ne[i]=i+1; } ne[n-1]=-1; scanf("%s",q); top=0; for(int i=0; i<n; i++) { if(q[i]=='(') sk[top++]=i; else { top--; mp[sk[top]]=i; mp[i]=sk[top]; } } scanf("%s",s); p--; for(int i=0; i<m; i++) { if(s[i]=='R') p=ne[p]; if(s[i]=='L') p=pre[p]; if(s[i]=='D') { int y=mp[p]; if(q[p]=='(') { if(pre[p]!=-1) ne[pre[p]]=ne[y]; if(ne[y]!=-1) pre[ne[y]]=pre[p]; if(ne[y]==-1) p=pre[p]; else p=ne[y]; } else { if(pre[y]!=-1) ne[pre[y]]=ne[p]; if(ne[p]!=-1) pre[ne[p]]=pre[y]; if(ne[p]==-1) p=pre[y]; else p=ne[p]; } } } while(pre[p]!=-1) p=pre[p]; for(int i=p; i!=-1; i=ne[i]) { printf("%c",q[i]); } printf("\n"); return 0; }