A - Ice Tea Storehttp://agc019.contest.atcoder.jp/tasks/agc019_a
题意:买N升的饮料,然后商店有4种规格的饮料以及相对的价格,规格分别为0.25,0.5,1,2 ,价格分别为Q,H,S,D,然后问买N升不得不花多少钱及最小价格为多少? N,H,H,S,D都为整数。
思路:因为N为整数,所以要么买N/2*D+S,要么买N/2*D,所以不断往上更新规格为1,2的最小价格就行了。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long long int main() { ll q,h,s,d; ll n; scanf("%lld%lld%lld%lld",&q,&h,&s,&d); scanf("%lld",&n); h=min(q*2,h); s=min(h*2,s); d=min(s*2,d); if(n%2) printf("%lld\n",n/2*d+s); else printf("%lld\n",n/2*d); return 0; }
B - Reverse and Comparehttp://agc019.contest.atcoder.jp/tasks/agc019_b
题意:给你一个字符串,然后你可以任意反转区间i-j的子串,每次只能反转一个字串,问可以得到多少个不相同的字符串。
思路:首先至少i!=j进行反转才有可能得到不同于起始的串,除去i!=j的情况,带上起始的串可以得到的串的总数为(1+2+。。。+n-1)+1,n为串的长度,然后重复的是哪些呢?经过观察,就是各个字母出现的次数的C(x,2)(x>=2),然后用总数减去就得到答案了。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; #define MAX 200005 #define ll long long char s[MAX]; map<char,ll> vis; ll c(ll x) { if(x>=2) return x*(x-1)/2; else return 0; } int main() { scanf("%s",s); ll n; n=strlen(s); for(int i=0;i<n;i++) vis[s[i]]++; ll ans=1; for(int i=1;i<n;i++) ans+=i; for(int i=0;i<26;i++) ans-=c(vis[i+'a']); printf("%lld\n",ans); return 0; }

浙公网安备 33010602011771号