0%

用到了 set 和 iterator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
struct data{
int x,i;
};
data dt[200000];
bool cmp(data a,data b){
return a.i<b.i;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;int L;
cin>>n>>L;
for(int i=0;i<n;i++){
cin>>dt[i].x;
cin>>dt[i].i;
}
sort(dt,dt+n,cmp);
set<int> s;
s.insert(0);
s.insert(L);
long long sum=0;
set<int>::iterator ptrE=s.begin();
set<int>::iterator ptrB=s.end();
for(int i=0;i<n;i++){
s.insert(dt[i].x);
ptrE=s.lower_bound(dt[i].x);
ptrE--;
ptrB=ptrE;
ptrE++;ptrE++;
sum+= (*ptrE)-(*ptrB);
}
cout<<sum;
return 0;
}
閱讀全文 »

題目連結:a364. 2. 神秘的進位問題 - 高中生程式解題系統

我是用窮舉法,找出每一種可能。程式碼如下~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>

using namespace std;

long long d(long long n){
if(n<=0)
return 1;
else
return n*d(n-1);

}

long long c(long long m,long long n){
if(m<n)
return 0;
else
return d(m)/(d(n)*d(m-n));
}

int main(){
long long iptNum,ipt=0;
bool isRight=false;

cin>>iptNum;

for(long long i=0;i<iptNum;i++){
long long a=0;
isRight=false;

ipt=0;
cin>>ipt;
for(long long j=2;j<17;j++){
for(long long k=1;k<j;k++){
for(long long l=0;l<k;l++){
a=c(j,3)+c(k,2)+c(l,1);

if(a==ipt){
cout<<j<<k<<l<<"\n";
break;
}
}
if(a==ipt){
break;
}
}
if(a==ipt){
break;
}
}
}

return 0;
}
閱讀全文 »

題目連結:a271. 彩色蘿蔔 - 高中生程式解題系統

輸入與輸出的優化,程式碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<iostream>
#include<sstream>
#include<string>

using namespace std;

int main(){
int dataNum=0;
stringstream stream;

string s;
int temp;
int poison=0;
bool isLife=true;

cin>>dataNum;
s="\n";getline(cin,s);
for(int i=0;i<dataNum;i++){
isLife=true;
int x,y,z,w,n,m;

s="";
getline(cin,s);

stream.clear();
stream.str("");
stream<<s;
stream>>x>>y>>z>>w>>n>>m;
s="";
getline(cin,s);
if(s!=""){
poison=0;
temp=0;

stream.clear();
stream<<s;
while(stream>>temp){
m-=poison*n;
if(m<=0){
isLife=false;
break;
}

if(temp==1){
m+=x;
}else if(temp==2){
m+=y;
}else if(temp==3){
m-=z;
if(m<=0){
isLife=false;
break;
}
}else if(temp==4){
m-=w;
if(m<=0){
isLife=false;
break;
}
poison+=1;
}
}
if(isLife){
cout<<m<<"g"<<endl;
}else{
cout<<"bye~Rabbit"<<endl;
}
}else{
cout<<m<<"g\n";
}
}
return 0;
}
閱讀全文 »

題目連結:a034. 二進位制轉換 - 高中生程式解題系統

參考程式碼如下,反覆除2取餘數即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

int main(int argc, char **argv){
int a,r,c=0;
int ans[60];
while(cin>>a){
while(a>0){
r=a%2;
ans[c]=r;
c++;
a=a/2;
}
for(int i=(c-1);i>=0;i--){
cout<<ans[i];
ans[i]=0;
}
cout<<"\n";
c=0;
}
return 0;
}
閱讀全文 »