A - Double Click
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int t[N];
int main()
{
int n,d;
cin>>n>>d;
for(int i=1;i<=n;i++) cin>>t[i];
bool flag=false;
int idx=-1;
for(int i=2;i<=n;i++){
if(t[i]-t[i-1]<=d){
idx=i;
flag=true;
break;
}
}
if(flag) cout<<t[idx]<<endl;
else cout<<idx<<endl;
return 0;
}
B - chess960
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int cnt1,cnt2,cnt3,cnt4,cnt5;
vector<int>a,b,c;
int main()
{
string s;
cin>>s;
bool flag=true;
for(int i=0;i<s.size();i++){
if(s[i]=='B') a.push_back(i+1);
if(s[i]=='R') b.push_back(i+1);
if(s[i]=='K') c.push_back(i+1);
}
if(a[0]%2==a[1]%2) flag=false;
if(c[0]>b[0]&&c[0]<b[1]&&flag) puts("Yes");
else puts("No");
return 0;
}
C - PC on the Table
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=110;
char s[N][N];
int h,w;
int main()
{
cin>>h>>w;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>s[i][j];
}
}
for(int i=1;i<=h;i++){
for(int j=1;j<=w-1;j++){
if(s[i][j]=='T'&&s[i][j+1]=='T'){
s[i][j]='P';
s[i][j+1]='C';
}
}
}
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cout<<s[i][j];
}
cout<<endl;
}
return 0;
}
D - Count Subtractions
数据太大了,纯模拟必定超时
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define int long long
using namespace std;
signed main()
{
int a,b;
cin>>a>>b;
int cnt=0;
while(a!=b){
if(a<b){
b=b-a;
cnt++;
}
else if(a>b){
a=a-b;
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
可以始终认定A大于B
如果AmodB等于0,那么cnt+=A/B-1
如果AmodB不等于0,那么cnt+=A/B,A=A%B
为什么想到整除呢?因为大的数如果减去小的数之后还是比小的数要大的话,肯定还是减去那个小的数,所以想到整除
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int cnt;
signed main()
{
int a,b;
cin>>a>>b;
while(a!=b){
if(a<b) swap(a,b);
if(a%b==0){
cnt+=a/b-1;
break;
}
else{
cnt+=a/b;
a=a%b;
}
}
cout<<cnt<<endl;
return 0;
}
E - Kth Takoyaki Set
共有N个整数,然后任意组合(同一个数可以用多次)的和,求第k小的和是多少
利用set自动升序,将一批一批的数放入set中,先将所有数都放入set中,然后接下来每一次都是将set中的第一个数(最小的数)加上原来的N个数放入set中,最后输出set中第k个数
为方便获取第k个数,可以用k次循环,然后每次删掉第一个数,k次循环后,set中的第一个数就是要求的第k小的数
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#include<vector>
#define int long long
using namespace std;
signed main()
{
vector<int>e;
set<int>s;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
int x;
cin>>x;
e.push_back(x);
}
sort(e.begin(),e.end());
s.insert(0);
while(k--){
int x;
for(int i=0;i<n;i++){
x=*s.begin();
s.insert(e[i]+x);
}
s.erase(x);
}
cout<<*s.begin()<<endl;
return 0;
}