CODEFORCE 1003 DIV4
这一场的div4,怎么说呢,怎么感觉比div3还难很多,算了就直接开始讲吧。
第一题,不难,可以直接用python把他水掉。
n=int(input())
for i in range(n):
s=input()
s=s[0:-2:]+'i'
print(s)
第二题是说告诉你有一个字符串,你可以选择两个相邻的元素进行如下的操作,首先将第二个元素删掉,然后将第一个元素修改成任意想要的字符串,执行这一操作的条件是第一个元素和第二个元素相等,在这里,如果我想要一直执行这一操作,要做的就是去不断的删除元素,同时把第一个元素变成与前一个元素相同的元素,所以在这里,如果出现一个连续的元素,他就一定会在最后被删掉长度为1,而如果没有连续的元素,那么就没有办法执行删除。最后字符串只会保持在原长度。
(一开始没有看明白题目在说啥,浪费了很多时间)
#include<bits/stdc++.h>
using namespace std;
void sol(){
string s;
cin>>s;
int flag=0;
for(int i=1;i<s.size();i++){
if (s[i]==s[i-1]){
flag=1;
}
}
if(flag==1){
cout<<1<<endl;
}
else{
cout<<s.size()<<endl;
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
sol();
}
}
对于C题,他这个是一个C1和C2是具有相同的性质的,所以就放在一起来讲一下了。
对于这道题,由于我要让整个数列变成一个不下降的数列,那么对于一个数字,为了维护这个数字,可以选择进行一个操作,将其变成b[j]-a[i]。在这里,由于在simple version 里面会出现b的长度只有1。所以在这里,为了保证后面的数字尽可能的大于前面的数字,那么我需要将前面的数字尽可能的小,所以,在这里,对于当前点a[i],我需要对其与b[j]-a[i]来比较,然后,如果
b[j]-a[i]可以满足>=a[i-1]且可以使数字变得更小,那么就更新当前的数字。
可以知道代码如下。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
inline void sol(){
int n,m;
cin>>n>>m;
vector<int> a(n+2),b(m+1);
a[0]=INT_MIN;
a[n+1]=INT_MAX;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
a[1]=min(a[1],b[1]-a[1]);
for(int i=2;i<=n;i++){
int tar=b[1]-a[i];
if(a[i-1]>a[i]){
if(a[i-1]<=tar) a[i]=tar;
else{
cout<<"NO"<<endl;
return;
}
} else if(a[i-1]<=tar) a[i]=min(a[i],tar);
}
for(int i=1;i<=n;i++){
if(a[i-1]>a[i] || a[i]>a[i+1]){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
return;
}
int main(){
int T;
cin>>T;
while(T--){
sol();
}
}
那么对于b数组的长度不等于1的,怎么做呢?其实我们的目的就是去让当前的数字a[i]尽可能的小,那么对于b[j]-a[i]>=a[i-1],那么我要去让b[j]尽可能接近a[i]+a[i+1],这样子就可以满足了,在这里,由于b可以任意选择,所以对数组b排序+二分就可以了。剩下的思路和第一题一样
#include<bits/stdc++.h>
using namespace std;
void sol(){
int n,m;
cin>>n>>m;
vector<int> a(n+2),b(m+1);
a[0]=INT_MIN;
a[n+1]=INT_MAX;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
sort(b.begin()+1,b.end());
a[1]=min(a[1],b[1]-a[1]);
for(int i=2;i<=n;i++){
auto it=lower_bound(b.begin()+1,b.end(),a[i]+a[i-1]);
int new_b;
if(it!=b.end()){
new_b=*it;
}
else{
continue;
}
int tar=new_b-a[i];
if(a[i-1]>a[i]){
if(a[i-1]<=tar) a[i]=tar;
else{
cout<<"NO"<<endl;
return;
}
} else if(a[i-1]<=tar) a[i]=min(a[i],tar);
}
// for(int i=1;i<=n;i++){
// cout<<a[i]<<" ";
// }cout<<endl;
for(int i=1;i<=n;i++){
if(a[i-1]>a[i] || a[i]>a[i+1]){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
return;
}
int main(){
int T;
cin>>T;
while(T--){
sol();
}
}
D题比较简单,感觉比C题简单。
这个题若是想要让这些数组的和的值尽可能大,那么我就要让大的数组排在前面,这样子他们的贡献就会大一点,然后就可以写出代码了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+7;
bool cmp(vector<ll> a,vector<ll> b){
ll sum_a=0;
ll sum_b=0;
for(ll i:a) sum_a+=i;
for(ll i:b) sum_b+=i;
return sum_a>sum_b;
}
vector<vector<ll>> a;
inline void sol(){
a.clear();
vector<ll> sum1;
ll n,m;
cin>>n>>m;
for(ll i=0;i<n;i++){
vector<ll> a1;
for(ll j=0;j<m;j++){
ll num;cin>>num;
a1.push_back(num);
}
a.push_back(a1);
}
sort(a.begin(),a.end(),cmp);
sum1.push_back(0);
for(ll i=0;i<n;i++){
for(ll j=0;j<m;j++){
sum1.push_back(a[i][j]);
}
}
for(ll i=1;i<sum1.size();i++){
sum1[i]=sum1[i]+sum1[i-1];
// cout<<sum1[i]<<" ";
} // cout<<endl;
ll ans=0;
for(ll i:sum1){
ans+=i;
}
cout<<ans<<endl;
}
int main(){
ll T;cin>>T;
while(T--){
sol();
}
}
本文作者:芙芙芙啊
本文链接:https://www.cnblogs.com/fufufuf/p/18714982
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。