A+B Problem
思路如题意
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
// int a[N];
struct node{
int idx;
int v;
}a[N];
int n;
int b[N];
bool cmp(node a, node b){
return a.v <= b.v;
}
int main(){
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i].v);
b[i] = a[i].v;
a[i].idx = i;
}
sort(a, a + n,cmp);
for(int i = 0; i < n; i++){
// int j = i;
if(a[n-1].idx != i){
b[i] += a[n - 1].v;
}
else{
// j++;
b[i] += a[n - 2].v;
}
}
for(int i = 0; i < n; i++) printf("%d ",b[i]);
}
Komorebi的数学课
快速幂模板
开始模板res写成了:res = a % q
泪目。
需反复练习
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e8;
ll n,m;
ll qmi(ll a, ll b, ll q){
ll res = 1 % q;
while(b){
if(b&1){
res = res * a % q;
}
a = a * a % q;
b >>= 1;
}
return res;
}
int main(){
scanf("%lld",&n);
printf("%lld\n",qmi(n,n,n + 2));
return 0;
}
次佛锅
相同单词但大小写不同,算不同的食材。
并且,相同的食材可能多次出现
,所以要累加,以及食材的数量可能是多位数
,而不单单是个位数。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4;
int n;
int q;
map<string,int> mp;
int main(){
string s;
getline(cin,s);
string t ="";
int num = 0;
for(int i = 0; i < s.size(); i++){
if((s[i] >='a' && s[i] <= 'z') ||( s[i] >= 'A' && s[i] <='Z')){
t += s[i];
}
else if(s[i] >= '0' && s[i] <='9'){
num = num * 10 + s[i] - '0';
// mp[t] += (s[i] - '0');
// t = "";
}
else if(s[i] ==' ' && (s[i - 1] >= '0' && s[i - 1] <='9')){
mp[t] += num;
num = 0;
t ="";
}
}
if(num != 0 && t != ""){
mp[t] += num;
t="";
num = 0;
}
scanf("%d",&q);
while(q--){
string ss;
cin >> ss;
cout << mp[ss] << endl;
}
return 0;
}
黄金律法
开始,思路是对的,将a数字非降序,将b数字非升序。
因为没有将ans=0放进多组样例中,在误解题意的路上越走越远。。。菜爆了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e6;
int n,m;
int a[N];
int b[N];
int t;
ll ans;
bool cmp(int a, int b){
return a > b;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ans = 0;
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
sort(a,a + n);
for(int i = 0; i < n; i++) scanf("%d",&b[i]);
sort(b,b + n,cmp);
for(int i = 0; i < n; i++){
ans += (1ll)*(a[i] * b[i]);
}
printf("%lld\n",ans);
}
// printf("%lld\n",qmi(n,n,n + 2));
return 0;
}
史东薇尔城
照着y总的模板写只能得90分。
发现,dis[j] > dist + w[i]
那里,需要将dist 换成dis[ver]
, 就过了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10, M = 1e8 + 10;
ll h[N],e[M],ne[M],idx,w[N];
ll dis[N];
bool st[N];
int n,m;
typedef pair<ll,ll> pii;
void add(int a, int b, int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void heap_dij(){
memset(dis,0x3f,sizeof(dis));
// memset(st,0,sizeof(st));
dis[1] = 0;
priority_queue<pii,vector<pii>,greater<pii>> heap;
heap.push({0,1});
while(heap.size()){
pii t = heap.top();
heap.pop();
int ver = t.second, dist = t.first;
if(st[ver])continue;
st[ver] = true;
for(int i = h[ver]; i != -1; i = ne[i]){
int j = e[i];
if(dis[j] > dis[ver] + w[i]){
dis[j] = dis[ver] + (1LL)*w[i];
heap.push({dis[j],j});
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
int q;
scanf("%d",&q);
heap_dij();
while(q--){
int x, y;
scanf("%d%d",&x,&y);
// if(x == 1 && y == 1) puts("1");
printf("%lld\n",(1ll)*(dis[x] + dis[y]));
}
}