Codeforces Round 1078 (Div. 2) 5/7
A. Lawn Mower
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long;
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;
void solve(){
int n,w;
cin>>n>>w;
cout<<n-n/w<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--) solve();
return 0;
}
B. Offshores
先预处理出来把所有钱都取出来的结果 \(sum\)
再枚举每一个银行,如果把钱存到当前银行,可以用 \(sum\) 计算出结果,对所有结果取最值即可
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long;
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;
void solve(){
int n,x,y;
cin>>n>>x>>y;
int ans=0,sum=0;
vector<int> a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i]/x;
}
for(int i=1;i<=n;i++){
ans=max(ans,a[i]+y*(sum-a[i]/x));
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--) solve();
return 0;
}
C. Secret message
循环节长度一定是 \(n\) 的因数,处理出因数然后对每个因数暴力就好了
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long;
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;
const int mx=50000;
void solve(){
int n,k;
cin>>n>>k;
vector<string> s(k+1);
for(int i=1;i<=k;i++){
cin>>s[i];
s[i]=" "+s[i];
}
vector<int> t;
for(int i=1;i<=n;i++){
if(n%i==0) t.push_back(i);
}
for(auto len:t){
int tar=n/len;
bool f=1;
string ans;
//len 是循环节的长度
for(int i=1;i<=len;i++){
vector<int> cnt(200);
for(int j=i;j<=n;j+=len){
//位置j
vector<int> tcnt(200);
for(int x=1;x<=k;x++){
tcnt[s[x][j]]++;
}
for(int x='a';x<='z';x++){
if(tcnt[x]) cnt[x]++;
}
}
int tf=0;
for(int j='a';j<='z';j++){
if(cnt[j]==tar){
tf=1;
ans.push_back((char)j);
break;
}
}
f*=tf;
}
if(f){
for(int i=1;i<=tar;i++){
cout<<ans;
}
cout<<endl;
return;
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--) solve();
return 0;
}
D. Table Cut
这能是 div2 的 D?
让乘积尽可能大,则两边一边一半
从下往上,从左往右找出前一半个 \(1\),然后把他们切下来就好了
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long;
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;
void solve(){
int n,m;
cin>>n>>m;
vector g(n+1,vector<int>(m+1));
int sum=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
sum+=g[i][j];
}
}
vector<int> t(m+1,n+1);
t[0]=1;
int cnt=sum/2;
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
if(g[i][j]!=1) continue;
cnt--;
t[j]=i;
if(cnt==0) break;
}
if(cnt==0) break;
}
cout<<sum/2 * ((sum+1)/2)<<endl;
for(int i=m-1;i>=1;i--){
t[i]=min(t[i+1],t[i]);
}
int now=1;
for(int i=1;i<=m;i++){
for(int j=now;j<t[i];j++){
cout<<'D';
now++;
}
cout<<'R';
}
while(now<n+1){
cout<<"D";
now++;
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--) solve();
return 0;
}
E. The Turtle Strikes Back
VP 时读错题了,读成了,修改一次走一步,修改一次走一步这样的,完全不可做
然后才发现居然是只在一开始修改一次。
直接枚举修改的格子就好了
对当前被修改的格子,只有选或不选两种结果
如果选的话,直接走就行
矩形的每条副对角线只会且一定会走过一个格子
如果不选,则一定是走了当前格子所在副对角线上的其他格子,找个最大值就行
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long;
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;
void solve(){
int n,m;
cin>>n>>m;
vector a(n+3,vector<int>(m+3,-inf));
auto f1=a,f2=a;
f1[0][1]=0;
f2[n+1][m]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f1[i][j]=max(f1[i-1][j],f1[i][j-1])+a[i][j];
}
}
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
f2[i][j]=max(f2[i+1][j],f2[i][j+1])+a[i][j];
}
}
vector<pii> b(n+m+10,{-inf,-inf});
//b=y-x
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int pos=j+i;
int val=f1[i][j]+f2[i][j]-a[i][j];
if(b[pos].first<val){
b[pos].second=b[pos].first;
b[pos].first=val;
}
else if(b[pos].first==val){
b[pos].second=val;
}
else{
b[pos].second=max(val,b[pos].second);
}
}
}
int t=inf;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int ans=-inf;
ans=max(ans,f1[i][j]+f2[i][j]-3*a[i][j]);
int val=f1[i][j]+f2[i][j]-a[i][j];
int pos=j+i;
if(val==b[pos].first){
ans=max(ans,b[pos].second);
}
else{
ans=max(ans,b[pos].first);
}
t=min(t,ans);
}
}
cout<<t<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--) solve();
return 0;
}

浙公网安备 33010602011771号