はい。
AtCoder Beginner Contest 116
A - Right Triangle
a,b,c=map(int,input().split())
print(a*b//2)
#include<bits/stdc++.h>
using namespace std;
#define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c)
int main(){
int a,b,c,t,h;
sc3(a,b,c);
t=min(a,min(b,c));
h=(a+b+c)-t-max(a,max(b,c));
printf("%d\n",t*h/2);
return 0;
}
Pythonのときは問題文をしっかり読んでます。C++のときは問題文をよく読みましょう。そして直角三角形の3辺であること前提ですが、a×b×cをしてからmaxで割ると底辺×高さが取り出せます。斜辺が最長の辺なので。
B - Collatz Problem
s=int(input())
chk=s
d={s:0}
for i in range(130):
if chk%2: chk=chk*3+1
else: chk//=2
if chk in d:
print(i+2)
break
else:
d[chk]=0
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
bool w[10000];
int main(){
int a;
sc1(a);
for(int i=1;i<10000;i++){
if (w[a]) {printf("%d\n",i); break;}
w[a]=1;
if(a%2) a=a*3+1;
else a=a/2;
}
return 0;
}
愚直に。
C - Grand Garden
n=int(input())
l=[int(i) for i in input().split()]
ans=l[0]
for i in range(1,n):
if l[i]>l[i-1]:
ans+=(l[i]-l[i-1])
print(ans)
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
int h[105];
int main(){
int n,x=101,ans=0;
sc1(n);
rep(i,n){
sc1(h[i]);
x=min(x,h[i]);
}
ans=x;
rep(i,n) h[i]-=x;
for(;;) {
int l=-1,r=-1,xx=101;
rep(i,n+1){
if (h[i]>0 && l==-1) l=i;
if (h[i]==0 && l>-1) {r=i; break;}
if (l>-1) xx=min(xx,h[i]);
}
if (l==-1) break;
ans+=xx;
for(int i=l;i<r;i++) {
h[i]-=xx;
}
}
printf("%d\n",ans);
return 0;
}
端から見て今の数が手前の数より大きい時は必ず水やりが必要。
今の数が手前の数より小さい時は手前の時に既に水やり終わってる。
なので手前より大きい時だけ差分を足していけば良い。だと思います。
って本当ですか。。。証明はないです。。
C++ではごりごりと
D - Various Sushi
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define sl1(a) scanf("%lld",&a)
#define sl2(a,b) scanf("%lld %lld",&a,&b)
int main(){
int n,k;
sc2(n,k);
vector<vector<int>> ds(n);
rep(i,n) {
int t,d;
sc2(t,d);
--t;
ds[t].push_back(d);
}
vector<int> y0,y1;
rep(i,n) {
if (ds[i].size() == 0) continue;
sort(ds[i].begin(),ds[i].end());
y1.push_back(ds[i].back());
ds[i].pop_back();
y0.insert(y0.end(), ds[i].begin(),ds[i].end());
}
sort(y0.rbegin(),y0.rend());
sort(y1.rbegin(),y1.rend());
long long ans=0;
int Y=max(0, k-int(y0.size()));
long long X=0;
rep(i,Y) X+=y1[i];
rep(i,k-Y) X+=y0[i];
while(1) {
ans=max(ans,X+(long long)Y*Y);
if (Y>=k || Y>=y1.size()) break;
X+=y1[Y];
X-=y0[k-Y-1];
++Y;
}
printf("%lld\n",ans);
return 0;
}
写経なのであとでじっくりコード読み直します。