Codeforces Round #674 (Div. 3)--划水
Codeforces Round #674 (Div. 3)
https://codeforces.com/contest/1426
A. Floor Number
思路
因为数据量小所以直接暴力枚举层数即可。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=1e5+7;
const ll mod=1e9+7;
int main(){
IO;
int t=1;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
if(n==1||n==2){
cout<<1<<endl;continue;
}
int k=1;
while(1)
{
if(n>=(k-1)*x+3&&n<=k*x+2)break;
k++;
}
cout<<k+1<<endl;
}
return 0;
}
B. Symmetric Matrix
思路
首先如果m是奇数则无法满足。
如果要构成对称矩阵只需要1个2×2的对称矩阵进行平铺即可
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=1e5+7;
const ll mod=1e9+7;
int main(){
IO;
int t=1;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
int x=0;
for (int i = 0; i < n; ++i)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if(c==b)x++;
}
if(m&1){
cout<<"NO"<<endl;
continue;
}
if(x)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C. Increase and Copy
思路
要想在最小的时间内完成,肯定需要先将1增大到某个值然后进行复制。
设这个临界值为x,则答案为x-1+(n-x)/x,即为:x+n/x,当x=sqrt(n)时取得最小值,所以x=sqrt(n)。
注意运算的向上取整
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=1e5+7;
const ll mod=1e9+7;
int main(){
IO;
int t=1;
cin>>t;
while(t--){
int n;
cin>>n;
int ans=n-1;
ll k=sqrt(1.0*(n+1));
cout<<(k-1+(n-1)/k)<<endl;
}
return 0;
}
D. Non-zero Segments
思路
将每个片段求和,如果出现重复的值即为存在sum为0的序列,需要安插一个数字,因为数字可以是任意值,可以直接安插一个无穷大值。
求出需要安插数字的最小数量,考虑到某些片段会相互影响,比如:1、4、-2、-2、-1,次序列中片段4、-2、-2改变后整个序列也会改变,所以需要单独处理每个sum是0的片段,处理完一个后将影响清空接着处理下一个。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=200007;
const ll mod=1e9+7;
int main(){
IO;
int t=1;
//cin>>t;
while(t--){
int n;
cin>>n;
map<ll,int>mp;
ll ans=0,sum=0;
mp[sum]=1;
for (int i = 1; i <= n; ++i)
{
cin>>a[i];
sum+=a[i];
if(mp[sum]){
ans++;
mp.clear();
mp[0]=1;
sum=a[i];
}mp[sum]=1;
}
cout<<ans<<endl;
}
return 0;
}
E. Rock, Paper, Scissors
思路
考虑得分最小的情况,
Alice的石头和布全部用于和Bob的布进行比较,得分为Bob的出布的次数减去Alice出的石头和布的总和(与0比较取max),此时Bob出的布只能和Alice的剪刀匹配;
Alice的剪刀和石头全部用于和Bob的石头进行比较,得分为Bob的出石头的次数减去Alice出的石头和剪刀的总和(与0比较取max),此时Bob出的石头只能和Alice的布匹配;
Alice的剪刀和布全部用于和Bob的剪刀进行比较,得分为Bob的出剪刀的次数减去Alice出的剪刀和布的总和(与0比较取max),此时Bob出的剪刀只能和Alice的石头匹配。
得分最大的情况为Alice的石头和Bob的剪刀匹配,Alice的剪刀和Bob的布匹配,Alice的布和Bob的石头相匹配。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=200007;
const ll mod=1e9+7;
int main(){
IO;
int t=1;
//cin>>t;
while(t--){
int n;
cin>>n;
int minn=0,maxn=0,a1,a2,a3,b1,b2,b3;
cin>>a1>>a2>>a3>>b1>>b2>>b3;
minn+=max(0,b3-a1-a3);
minn+=max(0,b2-a2-a3);
minn+=max(0,b1-a1-a2);
maxn+=min(a1,b2)+min(a2,b3)+min(a3,b1);
cout<<minn<<" "<<maxn<<endl;
}
return 0;
}
Code will change the world !