Codeforces Round #350 (Div. 2) A B C D1 D2 E
阿新 • • 發佈:2019-02-08
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;
}